为什么当我指定配置等待(false)时我还在主线程上

本文关键字:线程 配置 为什么 等待 false | 更新日期: 2023-09-27 18:36:15

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

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

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

谢谢

为什么当我指定配置等待(false)时我还在主线程上

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

ConfigureAwait暗示你不需要在同一个上下文中继续;这不是一个要求,你不能在同一个上下文中继续。

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

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