gpt4 book ai didi

c# - 将 SynchronizationContext 设置为 null 而不是使用 ConfigureAwait(false)

转载 作者:可可西里 更新时间:2023-11-01 08:25:56 24 4
gpt4 key购买 nike

我有一个公开方法的同步和异步版本的库,但在幕后,它们都必须调用异步方法。我无法控制该异步方法(它使用 async/await 并且使用ConfigureAwait(false)),也无法替换它。

代码在 ASP .NET 请求的上下文中执行,因此为了避免死锁,这是我所做的:

var capturedContext = SynchronizationContext.Current;
try
{
// Wipe the sync context, so that the bad library code won't find it
// That way, we avoid the deadlock
SynchronizationContext.SetSynchronizationContext(null);

// Call the async method and wait for the result
var task = MyMethodAsync();
task.Wait();

// Return the result
return task.Result;
}
finally
{
// Restore the sync context
SynchronizationContext.SetSynchronizationContext(capturedContext);
}

这是否会产生与 MyMethodAsync 在其所有等待中使用 ConfigureAwait(false) 相同的效果?我忽略了这种方法还有其他一些问题吗?

(MyMethodAsync 完全不知道它正在 ASP .NET 上下文中运行,它不会调用 HttpContext.Current 或类似的任何东西。它只是执行一些异步 SQL 调用,并且作者没有在其中任何一个上放置 ConfigureAwait(false))

最佳答案

I have a library that exposes synchronous and asynchronous versions of a method, but under the hood, they both have to call an async method.

The library is wrong to expose a synchronous version .假装同步 API 不存在。

so to avoid deadlocks

如果调用使用async/await 的异步方法,死锁应该不会有任何问题。如果它不使用 ConfigureAwait(false),那么它就没有它应该有的效率,仅此而已。由 ConfigureAwait(false) 引起的死锁仅在您尝试进行同步异步同步时适用(即,如果您从该库调用同步 API)。

因此,最简单最简单的解决方案就是忽略同步 API,无论如何它们的设计都不正确:

return await MyMethodAsync();

关于c# - 将 SynchronizationContext 设置为 null 而不是使用 ConfigureAwait(false),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25095243/

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