关闭 .NET Core 应用程序时 DisposeAsync 方法死锁
DisposeAsync method deadlocks when shutting down a .NET Core App
在我的 .NET 5
控制台应用程序中,我有一个实现 IAsyncDisposable
的 class,因为它需要调用第三方库的异步关闭方法,如下所示:
public async ValueTask DisposeAsync()
{
await thirdParyLib.ShutDownAsync();
}
将 class 与 classic using
语句一起使用时,这可以正常工作。
但是,当我在 .NET Core 的依赖注入机制(作为单例)中注册 class 时,我遇到了问题。
特别是,当 .NET Core 应用程序停止 DI 框架时,DI 框架会自动(并正确地)在所有已注册的单例实例上调用 DisposeAsync()
。这将是完美的,但问题是此时代码挂在这里:
await thirdParyLib.ShutDownAsync();
我假设线程死锁了,但我不知道如何进一步诊断和解决问题。有什么想法吗?
好吧,我在我的具体情况下找到了解决方案,即直接调用第三方对象上的 Dispose()
,而不是有问题的专用异步方法。
在我的 .NET 5
控制台应用程序中,我有一个实现 IAsyncDisposable
的 class,因为它需要调用第三方库的异步关闭方法,如下所示:
public async ValueTask DisposeAsync()
{
await thirdParyLib.ShutDownAsync();
}
将 class 与 classic using
语句一起使用时,这可以正常工作。
但是,当我在 .NET Core 的依赖注入机制(作为单例)中注册 class 时,我遇到了问题。
特别是,当 .NET Core 应用程序停止 DI 框架时,DI 框架会自动(并正确地)在所有已注册的单例实例上调用 DisposeAsync()
。这将是完美的,但问题是此时代码挂在这里:
await thirdParyLib.ShutDownAsync();
我假设线程死锁了,但我不知道如何进一步诊断和解决问题。有什么想法吗?
好吧,我在我的具体情况下找到了解决方案,即直接调用第三方对象上的 Dispose()
,而不是有问题的专用异步方法。