我正在Connection
围绕互操作对象编写一个类似的类。特别是,我的连接的关闭是异步的。
我正在与之交互的对象的 API 很差,例如:
public interface InteropObject
{
void StartLongTask();
void IsLongTaskInProgress();
void AbortLongTask();
}
所有方法都立即返回。
这是我最终得到的界面:
public interface IConnection
{
// [..]
Task OpenAsync();
Task RunOperationAsync();
Task CloseAsync();
// [..]
}
以及以下实现:
public class Connection : IConnection
{
private InteropObject _myObject;
Task OpenAsync()
{ // some required stuff }
async Task RunOperationAsync()
{
_myObject.StartLongTask()
while(_myObject.IsLongTaskInProgress())
{
await Task.Delay(TimeSpan.FromSeconds(1));
}
}
async ask CloseAsync()
{
if(_myObject.IsLongTaskInProgress())
{
_myObject.AbortLongTask();
// because the abort is not immediate, I have to wait until the end
while(_myObject.IsLongTaskInProgress())
{
await Task.Delay(TimeSpan.FromSeconds(1));
}
}
}
}
我面临的问题是我对采取的方法有点困惑,关于实现与否IDisposable
。IDisposableAsync
根据MSDN:
在实现 IAsyncDisposable 接口时,通常类也将实现 IDisposable 接口。
但在 MSDN示例中,它们Utf8JsonWriter
同时实现了 aIDisposable
和IDisposableAsync
方法,这使得这些接口的实现在他们的示例中变得容易。
就我而言,我没有同步清理操作。我不想实现这样的操作,因为我不希望Close
操作在当前操作实际完成之前返回。
那么,只实施可以IDisposableAsync
吗?
或者我应该实现一个同步Close
方法(只调用_myObject.AbortLongTask();
,或者可能使用丑陋Thread.Sleep()
的而不是Task.Delay()
)并同时实现IDisposable
and IDisposableAsync
?