C# 如何解决这一僵局?

C# 如何解决这一僵局?,c#,uwp,win-universal-app,deadlock,C#,Uwp,Win Universal App,Deadlock,我有一个UWP应用程序,我试图从本地文本文件中存储和检索一些数据,但无论我如何尝试,应用程序都会死锁。由于需要进行同步,我尝试使用任务并等待其完成,但应用程序仍然会锁定 在我的UWP应用程序中有一个名为“MainPage”的页面,在其构造函数中有以下代码: var listenkeyViewModel = new ListenkeyViewModel(); listenkeyViewModel.GetKey(); listenkey = listenkeyViewModel.Listenkey;

我有一个UWP应用程序,我试图从本地文本文件中存储和检索一些数据,但无论我如何尝试,应用程序都会死锁。由于需要进行同步,我尝试使用任务并等待其完成,但应用程序仍然会锁定

在我的UWP应用程序中有一个名为“MainPage”的页面,在其构造函数中有以下代码:

var listenkeyViewModel = new ListenkeyViewModel();
listenkeyViewModel.GetKey();
listenkey = listenkeyViewModel.Listenkey;
get键是这里的问题,因为它调用ViewModel上的一个方法(我创建它是为了同步,因为我认为尽快使调用同步会更好)

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");
    }
}
public void GetKey()
{
尝试
{
var listenKeyTask=RetrieveListenKey();
_listenkey=listenkytask.Result;
}
捕获(例外e)
{
}
}
公共静态异步任务RetrieveListenKey()
{
尝试
{
var storageFolder=Windows.Storage.ApplicationData.Current.LocalFolder;
var listenkeyFile=wait-storageFolder.GetFileAsync(“listenkey.txt”);
返回等待Windows.Storage.FileIO.ReadTextAsync(listenkeyFile);
}
捕获(例外e)
{
抛出新异常(“无法加载文件”);
}
}

我知道事情是“一路异步”,但这在这里是不可能的。我不能使原始代码所在的构造函数异步。你怎么能不陷入僵局?我不明白。

GetKey
转换为异步/wait

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
,因此这应该允许进程在没有死锁的情况下运行。

将代码从构造函数中移开。放入类似“InitializeAsync”之类的异步方法中。这是最好的解决方案。