繁体   English   中英

接口实现不提供async怎么办

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM