想象一下有一个类可以执行一些操作并在模式窗口中显示结果。 该类的处置成本很高,即它必须释放资源,这可能需要几秒钟的时间。 问题:当我关闭窗口时,我调用 dispose 方法来释放所有对象。这会导致窗口在关闭前冻结几秒钟。我想避免这种情况。
研究让我想到了 IAsyncDisposable。我的工作实现如下所示:
public class MyClass : IAsyncDisposable, IDisposable
{
private bool disposedValue;
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// Disposing some costly stuff
}
disposedValue = true;
}
}
public void Dispose()
{
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
public async ValueTask DisposeAsync()
{
await Task.Run(Dispose);
}
}
通过以下方式调用:
myClassInstance.DisposeAsync().ConfigureAwait(false);
问题:这是否有效,尤其是 DisposeAsync 方法的实现?这里会出问题吗?它工作得很好,但我有点不相信。
我对此做了一些研究,但没有发现有人这样做。 更重要的是,Visual Studio 告诉我应该对通过调用 DisposeAsync 方法获得的 ValueTask 执行某些操作。对此有何评论?
如果您想在后台处理某些内容(并且该处理本质上是同步的),只需在后台处理它即可;例如代替:
obj.Dispose();
考虑:
ThreadPool.QueueUserWorkItem<IDisposable>(static s => s.Dispose(), obj, false);
最终异步和并发是相关但不同的概念;在这种情况下,我们想要的是并发性,并且异步是不相关的 - 不需要(或目的)添加或删除它。