问题描述
从 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;
}
}
问题是:以下场景是否可能?为什么?
解决方法
是的,可以同时进行 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$,...]
调用。从技术上讲,实现应该正确处理这个问题,但在现实世界的代码中,并发DisposeAsync
或Dispose
调用是非常罕见的,因此大多数实现都没有正确处理这个问题。
如果这是一个令人担忧的问题,我建议使用我的 Disposables 库,该库可确保处理时的精确一次语义。但是,它是根据类型想要实现 Dispose
或 DisposeAsync
而不是两者的假设编写的。