当我指定ConfigureAwait(false)时,为什么我仍然在主线程上?

K. *_* L. 7 c# wpf async-await

我试图了解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";
    });
}
Run Code Online (Sandbox Code Playgroud)

从我的读数中,我了解到ConfigureAwait设置为false将允许我指定我不想保存当前上下文以用于需要在await关键字之后执行的Task的"rest".

在调试之后,我意识到当我有这段代码时,有时代码在主线程之后运行:await GetSomeString().ConfigureAwait(false); 虽然我特意添加了配置等待.

我原以为它总是运行在与进入Task之前的那个线程不同的线程上运行.

有人可以帮我理解为什么吗?

非常感谢你

Jon*_*eet 12

很可能你正在运行的任务立即完成 - 这意味着await甚至不需要安排继续.一种async方法只在需要时安排延续; 如果你等待已经完成的东西,它就会继续 - 在同一个线程中.

ConfigureAwait是,你没有一个提示需要继续在同样的背景下; 并不要求您不得继续使用相同的上下文.

如果你将任务改为不能立即完成的事情 - 例如电话Thread.Sleep(1000)(当然你通常不会这样做),我希望你看到行为的改变.

我可能错过了其他的东西,这不是问题的原因,但至少值得尝试一下.