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

时间:2013-10-19 19:53:18

标签: 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";
    });
}

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

调试后我意识到当我有这段代码时,有时候代码在主线程之后运行:等待GetSomeString()。ConfigureAwait(false); 而我专门添加了configure等待。

我原本以为它总是运行在它进入任务之前所处的那个线程上。

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

非常感谢

1 个答案:

答案 0 :(得分:12)

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

ConfigureAwait提示你不需要继续在同一个环境中;这并不要求您不能继续在相同的背景下。

如果您将任务更改为不能立即完成的任务 - 例如致电Thread.Sleep(1000)(当然,您通常不会这样做)我希望您看到行为发生变化。

我可能错过了其他内容并且不是问题的原因,但至少值得尝试一下。