假设我有100个任务需要10秒钟.现在我想一次只运行10个,就像10个中的1个完成另一个任务一样,直到完成所有任务.
现在我总是习惯于ThreadPool.QueueUserWorkItem()这样的任务,但我已经读到这样做是不好的做法,我应该使用任务.
我的问题是我没有找到适合我的方案的好例子,所以你能让我开始研究如何通过Tasks实现这个目标吗?
我在多线程版本中实现了一个PageRank版本.我在4核Q6600上运行它.当我运行它设置为创建4个线程时,我得到:
real 6.968s
user 26.020s
sys 0.050s
Run Code Online (Sandbox Code Playgroud)
当我运行128个线程时,我得到:
real 0.545s
user 1.330s
sys 0.040s
Run Code Online (Sandbox Code Playgroud)
这对我来说毫无意义.基本算法是sum-reduce:
分析没有帮助.我不确定哪些数据有助于理解我的代码 - 请问问.
这让我很困惑.
我注意到ExecuteRegisteredAsyncTasks调用返回后的代码与该调用之前的代码在同一线程中执行。因此,我知道手动调用ExecuteRegisteredAsyncTasks不会释放请求处理线程来处理其他请求,并且应该仅自动调用此方法以获得扩展好处?
在msdn上是示例代码,但帮助无法回答此问题。
更新
就我而言,PageAsyncTasks我异步调用Web服务(使用Begin *和End *),所以我不使用线程池。
如何在C#中进行多个异步/等待链接?例如,启动少量HTTP请求,然后不要等待所有这些请求,但在每次完成后启动新请求?
我一直试图这样做:
创建'N'任务以执行并持续运行此数量的一段时间,在这种情况下,一个任务完成,然后我应该开始一个新任务以保持相同数量的任务.
我不知道是否可以使用TaskScheduler处理这个问题,或者我必须创建一个自定义的TaskScheduler.
我认为可以使用的另一个选项是,当任务完成时使用TPL DataFlow Producer-Consumer,然后taskcheduler接受生产者生成的新任务.
问题是:当一个任务完成以保持相同数量的任务时,如何创建新任务?
c# ×4
.net ×2
task ×2
asp.net ×1
async-await ×1
iis ×1
performance ×1
pthreads ×1
web-services ×1