2017-05-14 40 views
2

私は、ローカルテキストファイルからデータをいくつか格納して取得しようとしているUWPアプリケーションを持っていますが、アプリケーションをデッドロックする方法は問わないものです。同期が必要なため、私はタスクを使用してその完了を待ちますが、アプリケーションはロックします。このデッドロックを解決するにはどうすればいいですか?

私は、「メインページ」と呼ばれる自分のUWPアプリケーションのページを持っており、それのコンストラクタで、私は次のコードを持っている:

var listenkeyViewModel = new ListenkeyViewModel(); 
listenkeyViewModel.GetKey(); 
listenkey = listenkeyViewModel.Listenkey; 

それはViewModelににメソッドを呼び出すためのgetキーがここでの問題です(私は、コール同期はできるだけ早く望ましいだろう作ると思ったので、私は、同期であることを作成しました。

public void GetKey() 
{ 
    try 
    { 
     var listenKeyTask = RetrieveListenKey(); 
     _listenkey = listenKeyTask.Result; 
    } 
    catch (Exception e) 
    { 
    } 
} 

public static async Task<string> RetrieveListenKey() 
{ 
    try 
    { 
     var storageFolder = Windows.Storage.ApplicationData.Current.LocalFolder; 
     var listenkeyFile = await storageFolder.GetFileAsync("listenkey.txt"); 
     return await Windows.Storage.FileIO.ReadTextAsync(listenkeyFile); 
    } 
    catch (Exception e) 
    { 
     throw new Exception("Could not load file"); 
    } 
} 

を私はコンストラクタをすることはできません。私は事は、「すべての方法ダウン非同期(async)」である知っているが、これは、ここでは不可能です元のコードは非同期であるデッドロックを起こさないはずですか?分かりません。

+4

コードをコンストラクタから移動します。 'InitializeAsync'などの非同期メソッドに入れます。それが最善の解決策です。 –

答えて

3

public async Task GetKey() { 
    try { 
     var listenKeyTask = RetrieveListenKey(); 
     _listenkey = await listenKeyTask; 
    } catch (Exception e) { 
     //...should handle/log error 
    } 
} 

移動コンストラクタのうち、イベントハンドラにこれの呼び出しを待つ/非同期するGetKeyを変換します。ページの読み込みやページのライフサイクルの早期に呼ばれる他のイベントがあります。

partial class MainPage : Page { 
    ListenkeyViewModel listenkeyViewModel; 
    string listenkey; 

    public MainPage() { 
     InitializeComponent(); 
     listenkeyViewModel = new ListenkeyViewModel(); 
     // add a handler to be called when the page has been loaded 
     this.Loaded += OnPageLoaded;    
    } 

    async void OnPageLoaded(object sender, RoutedEventArgs e) {    
     await listenkeyViewModel.GetKey(); 
     listenkey = listenkeyViewModel.Listenkey; 
    } 

    // Shown for demonstration purposes only. 
    // This is typically autogenerated by Visual Studio. 
    private void InitializeComponent() { 
    } 
} 

async voidので、このプロセスがデッドロックせずに流れることができるようにすべきイベントハンドラ上で許可されています。

関連する問題