2

我正在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));
            }
        }
    }
}

我面临的问题是我对采取的方法有点困惑,关于实现与否IDisposableIDisposableAsync根据MSDN

在实现 IAsyncDisposable 接口时,通常类也将实现 IDisposable 接口。

但在 MSDN示例中,它们Utf8JsonWriter同时实现了 aIDisposableIDisposableAsync方法,这使得这些接口的实现在他们的示例中变得容易。

就我而言,我没有同步清理操作。我不想实现这样的操作,因为我不希望Close操作在当前操作实际完成之前返回。

那么,只实施可以IDisposableAsync吗?

或者我应该实现一个同步Close方法(只调用_myObject.AbortLongTask();,或者可能使用丑陋Thread.Sleep()的而不是Task.Delay())并同时实现IDisposableand IDisposableAsync

4

0 回答 0