[英]Library method: Async or not?
我已经意识到(可能是错误的)需要一些时间的库方法通常应该是异步的。 这是真的吗,如果是这样,当库方法中没有什么可等待的时候,应该怎么做? 我正在使用以下方法设计自己的库:
public Dictionary<FunctionEnum, double> Evaluate(Func<uint,uint> algorithm, IList<double>
suggestedList)
它接受一个接受 uint 并返回一个 uint 的方法,并多次使用该方法。 简而言之,我正在通过最小二乘法评估算法的复杂性 (BigO)。 有关血腥的详细信息,请参阅:
如果我的问题更适合 codereview.stackexchange,请告诉我。
方法 Evaluate 需要相当长的时间,因为它必须调用多次传入的算法方法。 算法方法不是异步的。
我当然可以将整个循环放置在任务中调用算法并等待任务,但各种文章表明这是一个糟糕的主意(例如: https : //channel9.msdn.com/Events/TechEd/Europe/2013/DEV- B318 )
在这个特定的练习中,我可以控制一些(但不是全部)定义算法的代码,因此算法方法可以定义为:
async Task<uint> algorithm(uint) { // perform algorithm }
我猜我的签名会变成:
public async Task<Dictionary<FunctionEnum, double>> Evaluate(Func<uint,Task<uint>> algorithm, IList<double>
suggestedList)
在这种情况下,我当然可以使 Evaluate 异步并且当然可以调用
await algorithm((uint) trial[i]);
但总的来说,有人想用非异步方法调用我的 Evaluate 方法并不是没有道理的,我想为他/她提供一个估计,即他们的算法是 O(N)、O(NLogN),等等。此外,(对我而言)不清楚我可以使算法方法真正异步而不在算法方法的主体中引入任务。 例如考虑 uint Fib(uint n) { 返回第 n 个斐波那契元素)。
这种方法可能需要很长时间(对于大 n),但同样,如何使它成为异步方法? 引入类似 await Task.Factory.StartNew( () => FibbonaciImplmentation(n); ); ??
想法? 谢谢!
方法 Evaluate 需要相当长的时间,因为它必须调用多次传入的算法方法。 算法方法不是异步的。
Evaluate
方法通过定时执行来工作。 由于“异步”通常意味着 I/O,并且由于 I/O 比 CPU 执行慢几个数量级(正在测量的实际算法),我不相信异步过载会有用。
我当然可以将调用算法的整个循环放在任务中并等待任务,但各种文章都表明这是一个糟糕的主意
自然同步的方法应该是同步的。 跑多久都无所谓。
如果Evaluate
由 UI 应用程序运行,并且希望保持其 UI 响应,则可以调用封装在Task.Run
的Evaluate
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.