Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 异步执行限制并发实例的数量_Multithreading_C# 4.0 - Fatal编程技术网

Multithreading 异步执行限制并发实例的数量

Multithreading 异步执行限制并发实例的数量,multithreading,c#-4.0,Multithreading,C# 4.0,我有一个简单的收藏,我正在这样循环: foreach (MyObject mo in myObjects) { myObject.RunAcync(); } RunAsync使用新线程(()=>{..})在单独的线程中执行代码。Start(),我无权更改RunAsync的代码。我需要将并发运行的myObject的实例数限制为N(实数为2..10)。使用.NET4和c#最有效的方法是什么?如果您可以修改RunAsync,使用我们现在的(.NET4)和即将发生的事情(现在您考虑一下,.NET

我有一个简单的收藏,我正在这样循环:

foreach (MyObject mo in myObjects)
{
   myObject.RunAcync();
}

RunAsync
使用
新线程(()=>{..})在单独的线程中执行代码。Start()
,我无权更改
RunAsync
的代码。我需要将并发运行的
myObject
的实例数限制为N(实数为2..10)。使用
.NET4
c#
最有效的方法是什么?

如果您可以修改
RunAsync
,使用我们现在的(.NET4)和即将发生的事情(现在您考虑一下,.NET4.5),我会使用任务并行库(TPL),并从
RunAsync
返回某种
Task
对象。然后,您可以很容易地判断完成了什么和正在运行什么,并使用内置的TPL负载平衡来限制正在运行的任务的数量。或者,如果您有一个非异步版本的方法,您也可以使用TPL调用该方法,它将处理负载平衡,并且一次只运行足够多的方法以避免性能问题

您的问题是,您如何知道这些RunAsync方法中有多少仍在运行?是的,其中一个问题,我没有由单个实例触发的完整事件…无法知道做了什么和什么仍在运行,我看不出在不修改
RunAsync
@Peter Ritchie的情况下如何做您想做的事情。如果从头开始实现,您将如何执行此任务?是否有此方法的非异步版本,例如
.Run()
。如果是这样的话,您可以用自己的代码将其包装起来,使其成为异步的。您可以将
myObject
传递给某个
RunScheduler
类上的方法,并且
RunScheduler
立即启动线程并递增计数,除非计数为20,在这种情况下,它会将它们添加到队列中。您需要能够看到他们何时完成计数器的减量并启动队列中的下一个计数器。