库方法:是否异步?

问题描述 投票:1回答:1

我已经(可能是错误地)弄明白了,通常需要花费一些时间的库方法通常应该是异步的。 是真的,如果是这样,那么在库方法中没有什么可等待的时候该怎么办?我正在使用以下方法设计自己的库:

 public  Dictionary<FunctionEnum, double> Evaluate(Func<uint,uint> algorithm, IList<double> 
   suggestedList)

它采用一个接受uint并返回uint的方法,并多次使用该方法。简而言之,我正在用最小二乘法评估算法的复杂度(BigO)。有关血腥细节,请参见:

https://codereview.stackexchange.com/questions/236557/my-c-code-to-evaluate-order-of-algorithm-is-returning-logn-or-n3-instead-of-n?noredirect=1#comment463662_236557

并且如果我的问题更适合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););之类的东西。 ??

想法?谢谢!

c# algorithm async-await shared-libraries
1个回答
1
投票
Evaluate方法要花很多时间,因为它必须调用多次传递的算法方法。算法方法不异步。

Evaluate方法通过定时执行来工作。由于“异步”通常表示I / O,并且由于I / O比CPU执行(正在测量的实际算法)慢几个数量级,因此我认为异步重载不会有用。

我当然可以将在其中调用算法的整个循环放在一个任务中,然后等待该任务,但各种文章都认为这是一个糟糕的主意

自然同步方法应该是同步的。运行多长时间都没关系。

[如果Evaluate由UI应用程序运行,并且希望保持其UI响应,则可以call the Evaluate method wrapped in a Task.Run

© www.soinside.com 2019 - 2024. All rights reserved.