8

我试图了解 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); 而我专门添加了配置等待。

我本来希望它总是在与它进入任务之前所在的线程不同的线程上运行。

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

非常感谢

4

1 回答 1

13

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

ConfigureAwait暗示您不需要相同的上下文中继续;这不是您不能在同一上下文中继续的要求。

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

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

于 2013-10-19T20:00:08.617 回答