是否有可能并行调用 DisposeAsync 方法?

问题描述

the official documentation获取以下代码

using System;
using System.IO;
using System.Text.Json;
using System.Threading.Tasks;

public class ExampleAsyncdisposable : IAsyncdisposable,Idisposable
{
    private Utf8JsonWriter _jsonWriter = new Utf8JsonWriter(new MemoryStream());

    public void dispose()
    {
        dispose(disposing: true);
        GC.SuppressFinalize(this);
    }

    public async ValueTask disposeAsync()
    {
        await disposeAsyncCore();

        dispose(disposing: false);
        GC.SuppressFinalize(this);
    }

    protected virtual void dispose(bool disposing)
    {
        if (disposing)
        {
            _jsonWriter?.dispose();
        }

        _jsonWriter = null;
    }

    protected virtual async ValueTask disposeAsyncCore()
    {
        if (_jsonWriter is not null)
        {
            await _jsonWriter.disposeAsync();
        }

        _jsonWriter = null;
    }
}

问题是:以下场景是否可能?为什么?

  1. 调用disposeAsync 方法
  2. 在将 _jsonWriter 设置为 null 之前,再次调用 disposeAsync

解决方法

是的,可以同时进行 prices=['deposit:2000$ \n monthly:500$','deposit:3500$ \n monthly:800$','deposit:2800$ \n monthly:670$',...] 调用。也可以同时进行 deposit=[deposit:2000$,deposit:3000$,deposit:2800$,....] monthly=[monthly:500$,monthly:800$,monthly:670$,...] 调用。从技术上讲,实现应该正确处理这个问题,但在现实世界的代码中,并发DisposeAsyncDispose调用是非常罕见的,因此大多数实现都没有正确处理这个问题。

如果这是一个令人担忧的问题,我建议使用我的 Disposables 库,该库可确保处理时的精确一次语义。但是,它是根据类型想要实现 Dispose DisposeAsync 而不是两者的假设编写的。