在WinRT中,为什么从同步上下文中调用Task.Result会阻止我的应用程序

时间:2013-12-07 20:58:37

标签: c# asynchronous windows-runtime

我参与将一些代码移植到Windows应用商店库。 在继续之前,我们有时可以等待异步操作的结果。我认为我们得到了Task的Result属性的答案,但由于某种原因它崩溃了我的应用程序。

我做了一个快速的Windows Store测试应用程序:

public MainPage()
{
    this.InitializeComponent();
    MyTextBox.Text = "0";
    var a = ReturnIntMax();
    MyTextBox.Text = "1";
    MyTextBox.Text = a.Result.ToString();
}

public async Task<int> ReturnIntMax()
{
    await Task.Delay(1000);
    return 5;
}

据我了解Result属性,这应该有效,所以我希望有人可以告诉我发生了什么。我对为什么这是糟糕的设计不感兴趣。我们正在处理大量的通信流量,我们不能允许冲突。如果有必要,我们可以解决这个问题,但首先我想了解它为什么不起作用。如果它不支持从同步上下文调用Result,我原以为它会给我一个编译器错误。

1 个答案:

答案 0 :(得分:0)

我在博客上描述了underlying cause of the deadlock。出于多种原因,这不是编译器错误;例如,要求编译器(负责将C#转换为IL)以理解各种用户界面框架的线程模型是违反关注点分离的。此外,为{em>可能在UI线程上的Result的每次调用添加错误都是不切实际的。

作为一般规则,请勿使用Task.WaitTask.Result。相反,找到一种方法来构建代码,使其异步。这可能很尴尬,但最终你会发现你最终得到了更好的UI设计(即,在主页面加载时不是阻止UI,你需要设计一个空白或“加载...”页面可以立即显示然后转换以显示数据)。我在constructorsproperties上发布的博客文章提供了一些关于如何使其async友好的建议。