Как использовать тип, который реализует как 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 для типа, реализующего их обоих?

0 ответов

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