Асинхронный интерфейс, реализация только для синхронизации: что из Task.FromResult или async-over-sync является меньшим C#

Место общения программистов C#
Anonymous
Асинхронный интерфейс, реализация только для синхронизации: что из Task.FromResult или async-over-sync является меньшим

Сообщение Anonymous »

У меня есть этот интерфейс для доступа к файлам от разных поставщиков:

Код: Выделить всё

interface IFileProvider
{
Task FileExistsAsync(string filePath);
...
}
Некоторые из его реализаций используют сетевые запросы, поддерживающие асинхронные вызовы, но одна нет: базовая реализация файловой системы с использованием File.Exists().
С точки зрения производительности или риска взаимоблокировок, что является меньшим злом, между простым выполнением блокирующего вызова в вызывающем потоке:

Код: Выделить всё

class FileSystemImplementation : IFileProvider
{
Task FileExistsAsync(string filePath) => Task.FromResult(File.Exists(filePath));
}
или использовать асинхронную синхронизацию?

Код: Выделить всё

class FileSystemImplementation : IFileProvider
{
Task FileExistsAsync(string filePath) => Task.Run(() => File.Exists(filePath));
}
или даже

Код: Выделить всё

class FileSystemImplementation : IFileProvider
{
async Task FileExistsAsync(string filePath) => await Task.Run(() => File.Exists(filePath));
}
?

Вернуться в «C#»