如何从 class 终结器调用 DisposeAsync?
How do I invoke DisposeAsync from a class finalizer?
如果遇到以下情况,我该怎么办:我的 class 是一些第三方 class 的包装器,必须从包装的 class 调用异步方法=25=] 在我的 Dispose 里面? (见下面的代码)。
当然我会实现 IAsyncDisposable.
但是 Microsoft recommends disposables 能够从他们的 finalizers 中处理掉
我的问题是如何在这里进行操作?
在 the documentation example 中,如果终结器不支持 IDisposable,则仅异步一次性对象 (_asyncDisposableResource) 不会被丢弃。
顺便说一句,他们说异步方法最好不要支持同步对:请参阅 here,所以这种情况很可能发生。
public class MyWrapperForTheRepository: IAsyncDisposable
{
private ThirdPartyRepository _wrappedRepository = new ThirdPartyRepository();
public void MakeSomeChanges() => _wrappedRepository.MakeSomeChanges();
public async ValueTask DisposeAsync()
{
await _wrappedRepository.SaveAllTheChangesAsync();
_wrappedRepository = null;
}
~MyWrapperForTheRepository()
{
?????????????????????
}
}
But Microsoft recommends disposables to be able to be disposed from their finalizers
完全没有。事实上,终结器应该不调用(无参数)Dispose()
,并且它们也不应该不调用DisposeAsync()
。
终结器仅用于处理非托管资源。就我个人而言,我建议每种类型 或者 都具有非托管资源 或 托管资源,但绝不能两者兼有。生成的代码比遵循 Dispose(bool disposing)
模式要干净得多。
如果遇到以下情况,我该怎么办:我的 class 是一些第三方 class 的包装器,必须从包装的 class 调用异步方法=25=] 在我的 Dispose 里面? (见下面的代码)。 当然我会实现 IAsyncDisposable.
但是 Microsoft recommends disposables 能够从他们的 finalizers 中处理掉
我的问题是如何在这里进行操作?
在 the documentation example 中,如果终结器不支持 IDisposable,则仅异步一次性对象 (_asyncDisposableResource) 不会被丢弃。
顺便说一句,他们说异步方法最好不要支持同步对:请参阅 here,所以这种情况很可能发生。
public class MyWrapperForTheRepository: IAsyncDisposable
{
private ThirdPartyRepository _wrappedRepository = new ThirdPartyRepository();
public void MakeSomeChanges() => _wrappedRepository.MakeSomeChanges();
public async ValueTask DisposeAsync()
{
await _wrappedRepository.SaveAllTheChangesAsync();
_wrappedRepository = null;
}
~MyWrapperForTheRepository()
{
?????????????????????
}
}
But Microsoft recommends disposables to be able to be disposed from their finalizers
完全没有。事实上,终结器应该不调用(无参数)Dispose()
,并且它们也不应该不调用DisposeAsync()
。
终结器仅用于处理非托管资源。就我个人而言,我建议每种类型 或者 都具有非托管资源 或 托管资源,但绝不能两者兼有。生成的代码比遵循 Dispose(bool disposing)
模式要干净得多。