gpt4 book ai didi

c# - 为什么我指定 ConfigureAwait(false) 时仍然在主线程上?

转载 作者:太空狗 更新时间:2023-10-29 20:04:47 28 4
gpt4 key购买 nike

我正在尝试了解 async/await 关键字的工作原理。我在 WPF 窗口上有一个文本 block 绑定(bind)到 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); 而我专门添加了配置等待。

我原以为它总是在与它进入任务之前所在的线程不同的线程上运行。

谁能帮我理解为什么?

非常感谢

最佳答案

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

ConfigureAwait 提示您不需要在同一上下文中继续;并不要求您一定不能在同一上下文中继续。

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

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

关于c# - 为什么我指定 ConfigureAwait(false) 时仍然在主线程上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19470420/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com