gpt4 book ai didi

c# - ConfigureAwait(false) 在这里实现了什么

转载 作者:行者123 更新时间:2023-11-30 12:21:00 25 4
gpt4 key购买 nike

如果在图书馆我有这个

public async DoSomething()
{
await Foo();
}

然后我将其称为 lib.DoSomething().ConfigureAwait(false).GetAwaiter().GetResult()

这会给我带来和图书馆最初拥有的一样的好处吗

public async DoSomething()
{
await Foo().ConfigureAwait(false);
}

最佳答案

不,它不会给您同样的好处。如果你有:

public async Task DoSomething()
{
await Foo();
}

然后做

lib.DoSomething().ConfigureAwait(false).GetAwaiter().GetResult()

例如,从 WPF 应用程序中的 UI 线程 - 您将死锁。在 await Foo() 之前,您处于 UI 线程(有特定于 WPF 的 SynchronizationContext.Current),在 await 之后,您将尝试返回到 UI 线程。 UI 线程在 GetResult() 上被阻塞,因此会导致死锁。实际上,ConfigureAwait(false) 在这里没有用。

如果另一方面你有

public async Task DoSomething()
{
await Foo().ConfigureAwait(false);
}

然后做

lib.DoSomething().GetAwaiter().GetResult()

不会发生死锁,因为 ConfigureAwait(false) 明确告知不要“继续捕获的上下文”,因此不要返回到 SynchronizationContext(此中的 UI 线程例)。

关于c# - ConfigureAwait(false) 在这里实现了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48785361/

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