我对C#上的整个Async/Await主题完全不熟悉.尽管有无数的问题得到解答,并且教程被无情地链接起来,但我仍然无法理解如何使用async/await.我想要实现的是wpf应用程序返回到UI上的渲染动画,同时它等待一个昂贵的方法调用来完成 - 在我的下面的例子中,那是GetLinesAsync()或者更具体地说,expensive_function()在:
void Button_Click(object sender, RoutedEventArgs e) {
MessageBox.Show(GetAMessage());
}
string GetAMessage() {
string ret = "";
foreach(string s in GetLinesAsync().Result)
ret += $"{s}\n";
return ret;
}
async Task<List<string>> GetLinesAsync() {
List<string> ret = new List<string>();
string[] ExpensiveResult = null;
if (await Task.Run(() => expensive_function(ref ExpensiveResult)) == expensive_stat.SUCCESS && ExpensiveResult != null)
{
foreach(string s in ExpensiveResult)
ret.Add(s);
}
Run Code Online (Sandbox Code Playgroud)
这样写,应用程序完全冻结,即使expensive_function()执行时间不长.除此之外,我不确定为什么会发生这种情况,这是我从await/async上阅读教程和解释时所理解的,特别是那些说你只能等待返回void或Task的方法的部分:
该生产线foreach(string s in GetLinesAsync().Result)实际上应该说foreach(string s in await GetLinesAsync().Result) …