【发布时间】:2013-07-16 18:42:05
【问题描述】:
我有一些 ConcurrentQueue 包含 Action ( System.Action )。 该队列中的每个动作都需要运行(需要使用invoke调用)。
当队列不为空时 => 需要调用该操作 => 但我想对将运行的并行任务的数量进行一些限制。 除此之外,可以随时将新操作添加到队列中。
怎么做?
(使用 .net 4.0)
我写了一些东西,但我不确定这是最好的方法
SemaphoreSlim maxThread = new SemaphoreSlim(5);
while( !actionQueue.IsEmpty )
{
maxThread.Wait();
Task.Factory.StartNew( () =>
{
Action action;
if( actionExecution.TryDequeue( out action) )
{
action.Invoke();
}
},
TaskCreationOptions.LongRunning ).ContinueWith( ( task ) => maxThread.Release() );
}
}
【问题讨论】:
-
你能解释一下真正的问题吗?为什么你觉得有必要限制任务的数量?
-
只是学术经验..我想学习。但我也想知道为什么我不需要做这个限制?
-
没有必要限制任务的数量——我现在看到你说的是并发执行的任务,而不是队列中的总数;下面lazyberezovsky 的答案是适合这种情况的正确答案。
-
看看 TPL 数据流,根据您的情况,它可以非常适合。 msdn.microsoft.com/en-us/library/hh228603.aspx