异步执行耗时处置

问题描述 投票:0回答:1

想象一下有一个类可以执行一些操作并在模式窗口中显示结果。 该类的处置成本很高,即它必须释放资源,这可能需要几秒钟的时间。 问题:当我关闭窗口时,我调用 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 执行某些操作。对此有何评论?

c# asynchronous concurrency dispose iasyncdisposable
1个回答
2
投票

如果您想在后台处理某些内容(并且该处理本质上是同步的),只需在后台处理它即可;例如代替:

obj.Dispose();

考虑:

ThreadPool.QueueUserWorkItem<IDisposable>(static s => s.Dispose(), obj, false);

最终异步和并发是相关但不同的概念;在这种情况下,我们想要的是并发性,并且异步是不相关的 - 不需要(或目的)添加或删除它。

© www.soinside.com 2019 - 2024. All rights reserved.