Как работать с интерфейсами 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
?