Как работать с интерфейсами IAsyncDisposable и IDisposable, когда синхронное удаление недоступно?

Я пишу 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 реализует как IDisposable и IDisposableAsync методы, которые на своем примере упрощают реализацию этих интерфейсов.

В моем случае у меня нет синхронной операции очистки. Я не хочу реализовывать такую ​​операцию, так как не хочу Close операция, чтобы вернуться, пока текущая операция не будет фактически завершена.

Итак, можно реализовать только IDisposableAsync?

Или мне следует реализовать синхронный Close метод (который вызывает только _myObject.AbortLongTask();, или может использовать уродливый Thread.Sleep() вместо Task.Delay()) и реализовать оба IDisposable и IDisposableAsync?

0 ответов

Другие вопросы по тегам