我参与将一些代码移植到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,我原以为它会给我一个编译器错误。
答案 0 :(得分:0)
我在博客上描述了underlying cause of the deadlock。出于多种原因,这不是编译器错误;例如,要求编译器(负责将C#转换为IL)以理解各种用户界面框架的线程模型是违反关注点分离的。此外,为{em>可能在UI线程上的Result
的每次调用添加错误都是不切实际的。
作为一般规则,请勿使用Task.Wait
或Task.Result
。相反,找到一种方法来构建代码,使其异步。这可能很尴尬,但最终你会发现你最终得到了更好的UI设计(即,在主页面加载时不是阻止UI,你需要设计一个空白或“加载...”页面可以立即显示然后转换以显示数据)。我在constructors和properties上发布的博客文章提供了一些关于如何使其async
友好的建议。