c# - 如何解决这个僵局呢?

标签 c# uwp win-universal-app deadlock

我有一个 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");
    }
}

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

最佳答案

GetKey 转换为异步/等待

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

将 this 的调用移出构造函数并移至事件处理程序中。例如页面加载或在页面生命周期早期调用的其他事件。

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 允许在事件处理程序上使用,因此这应该允许进程顺利进行而不会出现死锁。

关于c# - 如何解决这个僵局呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43964613/

相关文章:

c# - EF核心: Creating a link between items in the same table

c# - 使用基本身份验证的 HTTP 请求始终返回 401

uwp - KnownFolders.PicturesLibrary 访问被拒绝

xaml - VisualState AdaptiveTrigger不触发

c# - 是否可以将 Azure 函数标准 DI 容器切换为另一个容器?

c# - 为什么只有在VS2010中调试时cast总是返回零?

c# - 如何在 C# 中的自定义对象上使用 foreach 关键字

c# - 如何判断我的当前线程是否是 UI 线程?

c# - ListView 项中的多个文本项

powershell - 在使用 Visual Studio 部署 Windows 10 UWP 应用程序期间出现错误 DEP0700 0x80073cf3