为什么当我指定配置等待(false)时我还在主线程上
本文关键字:线程 配置 为什么 等待 false | 更新日期: 2023-09-27 18:36:15
我试图了解async/await关键字的工作原理。我在 WPF 窗口上有一个绑定到 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 关键字之后执行的任务的"其余"。
调试后,我意识到当我有这段代码时,有时代码在主线程上运行在行之后:await GetSomeString()。ConfigureAwait(false);虽然我专门添加了配置等待。
我本来希望它总是在与进入任务之前所在的线程不同的线程上运行。
有人可以帮助我理解为什么吗?
谢谢
很可能您正在运行的任务正在立即完成 - 这意味着await
甚至不需要安排延续。async
方法仅在需要时计划延续;如果你等待已经完成的事情,它就会继续前进 - 在同一个线程中。
ConfigureAwait
暗示你不需要在同一个上下文中继续;这不是一个要求,你不能在同一个上下文中继续。
如果你把你的任务改成不能立即完成的任务——例如打电话Thread.Sleep(1000)
(当然你通常不会这样做),我希望你会看到行为的变化。
我可能错过了其他东西,这不是问题的原因,但至少值得先尝试一下。