我已经(可能是错误地)弄明白了,通常需要花费一些时间的库方法通常应该是异步的。 是真的,如果是这样,那么在库方法中没有什么可等待的时候该怎么办?我正在使用以下方法设计自己的库:
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 async并可以调用
await algorithm((uint) trial[i]);
“ )等另外,(对我而言)尚不清楚是否可以在不将Task引入算法方法主体的情况下使算法方法真正地异步。考虑一下uint Fib(uint n){返回第n个Fibonnacci元素)。此方法可能需要很长时间(对于较大的n),但是又一次,如何使它成为异步方法呢?介绍诸如await Task.Factory.StartNew(()=> FibbonaciImplmentation(n););之类的东西。 ??想法?谢谢!
Evaluate方法要花很多时间,因为它必须调用多次传递的算法方法。算法方法不异步。
Evaluate
方法通过定时执行来工作。由于“异步”通常表示I / O,并且由于I / O比CPU执行(正在测量的实际算法)慢几个数量级,因此我认为异步重载不会有用。
我当然可以将在其中调用算法的整个循环放在一个任务中,然后等待该任务,但各种文章都认为这是一个糟糕的主意
自然同步方法应该是同步的。运行多长时间都没关系。
[如果Evaluate
由UI应用程序运行,并且希望保持其UI响应,则可以call the Evaluate
method wrapped in a Task.Run
。