我试图了解async / await关键字的工作原理。我在WPF窗口上有一个textblock绑定到TextBlockContent字符串属性和一个触发单击ChangeText()的按钮。
这是我的代码:
public async void ChangeText()
{
string mystring = await TestAsync();
this.TextBlockContent= mystring;
}
private async Task<string> TestAsync()
{
var mystring = await GetSomeString().ConfigureAwait(false);
mystring = mystring + "defg";
return mystring;
}
private Task<string> GetSomeString()
{
return Task.Run(() =>
{
return "abc";
});
}
从我的阅读中,我了解到ConfigureAwait设置为false将允许我指定我不想为在await关键字之后需要执行的Task的“rest”保存当前上下文。
调试后我意识到当我有这段代码时,有时候代码在主线程之后运行:等待GetSomeString()。ConfigureAwait(false); 而我专门添加了configure等待。
我原本以为它总是运行在它进入任务之前所处的那个线程上。
有人可以帮助我理解为什么吗?
非常感谢
答案 0 :(得分:12)
您正在运行的任务可能会立即完成 - 这意味着await
甚至不需要安排继续。 async
方法仅在需要时安排延续;如果你等待已经完成的东西,它就会继续 - 在同一个线程中。
ConfigureAwait
提示你不需要继续在同一个环境中;这并不要求您不能继续在相同的背景下。
如果您将任务更改为不能立即完成的任务 - 例如致电Thread.Sleep(1000)
(当然,您通常不会这样做)我希望您看到行为发生变化。
我可能错过了其他内容并且不是问题的原因,但至少值得尝试一下。