2017-05-14 63 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被允许在事件处理程序所以这应该让这个进程了无死锁流动。