【发布时间】:2016-05-22 14:38:41
【问题描述】:
为了理解 async/await,我制作了一个带有一个按钮的小示例 WPF 应用程序。当点击它会做一些“工作”:
private async void goButtonClicked(object sender, EventArgs e)
{
WhatThreadAmI();
var task = populateRawData().ConfigureAwait(false);
WhatThreadAmI();
BusyIndicator.IsBusy = true;
await task;
WhatThreadAmI(); //this isnt on the main thread - why??
BusyIndicator.IsBusy = false;
Console.WriteLine("fin");
}
“WhatThreadAmI”只是将当前线程与我在初始化时保存的 UI 线程进行比较。
public bool IsMainThread => uiThread == Thread.CurrentThread;
我希望它的输出是 True - True - True,在填充原始数据方法中调用“WhatThreadAmI”会返回 false。
实际发生的是真 - 真 - 假,填充原始数据方法中的“WhatThreadAmI”调用返回真。
我知道我必须在这里遗漏一些非常基本的东西,但是有人可以帮助我了解发生了什么吗?
【问题讨论】:
-
即使是这样,您在创建任务时确实会说
.ConfigureAwait(false),这意味着“我不需要在原始上下文中恢复。”只要您await执行该任务,您的上下文就会发生变化,所以这并不奇怪。当您只是创建任务但尚未等待它时,上下文不会改变,因此前两个WhatThreadAmI返回true。 -
有道理 - 谢谢!
标签: c# async-await