Как использовать тип, который реализует как IDisposable, так и IAsyncDisposable?
В настоящее время я работаю с ASP.NET core 3.1 и C# 8.
Это первый раз, когда я касаюсь всего IAsyncDisposable
история, поэтому вполне возможно, что я понимаю лишь частично и что этот вопрос глупый.
Насколько я понимаю, тип должен реализовывать IAsyncDisposable
интерфейс, когда ему необходимо асинхронно освободить ресурсы, которыми он владеет, так что требуемое удаление может быть выполнено без блокировки потока. Перефразируй,IAsyncDisposable
является асинхронным аналогом IDisposable
что позволяет эффективно освобождать ресурсы класса (с точки зрения использования потоков).
Язык поддерживает использование типов, реализующих IAsyncDisposable
с помощью нового await using
конструкция, которая в основном является асинхронным аналогом using
ключевое слово.
Все идет нормально.
Я заметил, что есть несколько типов BCL, которые реализуют оба IAsyncDisposable
а также IDisposable
, один из них Stream
абстрактный класс. Я столкнулся с этим сценарием при работе с загруженными файлами в ядре ASP.NET и вызове IFormFile.OpenReadStream
метод.
Теперь у меня следующий вопрос: как мне использовать тип, реализующий оба IAsyncDisposable
а также IDisposable
? Стоит ли использовать классикуusing
ключевое слово или я должен выбрать await using
?
Фрагмент кода, который я писал, является синхронным, поэтому наиболее естественный способ работы с потоком следующий:
using var readStream = uploadedFile.OpenReadStream();
var options = new LoadOptions(loadFormat);
return new Workbook(readStream, options);
Должен ли я сделать свой метод async
чтобы иметь возможность использовать await using
следующим образом?
await using var readStream = uploadedFile.OpenReadStream();
var options = new LoadOptions(loadFormat);
return new Workbook(readStream, options);
(учтите, что помимо await using
вызов, мой метод не обязательно должен быть асинхронным)
Какая разница в звонке Dispose
против DisposeAsync
для типа, реализующего их обоих?