Допустим, у меня есть интерфейс:
interface ILoader()
{
Task<Data> LoadAsync(int id);
}
У меня есть две реализации этого интерфейса:
class NiceDataBase : ILoader
{
public async Task<Data> LoadAsync(int id)
{
//this database has async way of fetching the data
return await NiceDataBaseDriver.LoadDataAsync(id);
}
}
class NotNiceDataBase : ILoader
{
public async Task<Data> LoadAsync(int id)
{
//this database's driver does not have aysnc methods, because it's old or done poorly.
return await Task.Run(() => NotNiceDataBaseDriver.LoadData(id));
}
}
NotNiceDataBase не предоставляет реального асинхронного способа загрузки данных, поэтому я фактически запускаю его в новом потоке, который, как я понимаю, не является в действительности асинхронным, потому что реальный асинхронный не использует новый поток. Является ли моя реализация NotNiceDataBase хорошей? Это немного обманывает пользователя, когда он думает, что он выполняет настоящую асинхронную операцию.
Какой оптимальный способ справиться с такой ситуацией? Я думаю, что клиент NotNiceDataBase должен быть полностью осведомлен о том, что он делает, иначе он не сможет хорошо контролировать производительность приложения hiw.
Мой интерфейс может иметь дополнительный метод Load. Но в таком случае, какова реальная выгода здесь? Тем не менее, LoadAsync NotNiceDataBase должен иметь некоторую реализацию. Я думаю, что выбрасывание NotImplementedException никогда не является хорошим решением.