在试图理解异步/等待我做了一个示例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;
我预计这个输出是真 - 真 - 真,随着填入原始数据法“WhatThreadAmI”调用返回false。
实际发生什么是真正的 - 真 - 假,随着填入原始数据法“” WhatThreadAmI”调用返回true
我知道我必须在这里失去了一些非常基本的,但有人请帮助。我明白了是怎么回事?
[异步不是线程](http://stackoverflow.com/q/17661428/11683)。 – GSerg
即使是这样,当您创建任务时,确实会说'.ConfigureAwait(false)',这意味着“我不需要在原始上下文中恢复”。只要你“等待”那个任务,你的环境就会改变,所以在这里就不足为奇了。当你简单地创建任务但不等待它时,上下文不会改变,所以两个第一个'WhatThreadAmI'返回'true'。 – GSerg
有道理 - 谢谢! – smodle