[英]What to do when interface implementation does not provide async
假设我有一个界面:
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 方法。 但在这种情况下,这里的真正好处是什么? NotNiceDataBase 的 LoadAsync 仍然需要一些实现。 我认为抛出 NotImplementedException 从来都不是一个好的解决方案。
如您所知, async
是一个实现细节,您不能在接口上定义async
。 所以你所要做的就是
public class NotNiceDataBase : ILoader
{
public Task<Data> LoadAsync(int id)
{
//this database's driver does not have aysnc methods, because it's old or done poorly.
var result = NotNiceDataBaseDriver.LoadData(id);
return Task.FromResult(result);
}
}
简单地同步运行该方法并返回一个完成的任务,例如
class NotNiceDataBase : ILoader
{
public Task<Data> LoadAsync(int id)
{
var data = NotNiceDataBaseDriver.LoadData(id);
return Task.From(data);
}
}
你说
我认为 NotNiceDataBase 的客户端应该完全清楚自己在做什么,否则他无法很好地控制 hi(s) 应用程序的性能。
我不同意,如果性能是一个问题,并且如果他们确定这是对NotNiceDataBase
的调用,那么他们可以采取一些措施。
阐述
担心客户如何使用界面的时间几乎肯定是浪费了1次,甚至不是“过早的优化”,而是对其他人未知的优化需求的存在焦虑。
1除非你是你自己的客户,否则它仍然可能是在浪费时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.