2017-05-14 38 views
2

我有一個UWP應用程序,我試圖從本地文本文件存儲和檢索一些數據,但無論我如何嘗試這樣做,應用程序都會死鎖。由於需要同步的東西發生,我嘗試使用任務並等待其完成,但是應用程序仍然鎖定。如何解決這個僵局?

我在叫「的MainPage」 UWP應用和它的構造函數有一個網頁,我有以下代碼:

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

的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"); 
    } 
} 

我知道事情是「異步一路下跌」,但在這裏,這是不可能的。我不能讓構造,其中原始代碼是異步的,你好嗎?應該不會陷入僵局?我不明白。

+4

將代碼從構造函數中移開。使用像「InitializeAsync」之類的異步方法。這是最好的解決方案。 –

回答

3

轉換GetKey到異步/等待

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

移動的這一調用了構造函數,進入事件處理程序。例如頁面加載或在頁面生命週期中早期調用的其他事件。

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被允許在事件處理程序所以這應該讓這個進程了無死鎖流動。