我有一些包含Action(System.Action)的ConcurrentQueue。
此队列中的每个操作都需要运行(需要使用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() );
}
}
最佳答案
看一下MSDN文章How to: Create a Task Scheduler That Limits Concurrency。您可以从中使用LimitedConcurrencyLevelTaskScheduler
实现,使您的代码如下所示:
var scheduler = new LimitedConcurrencyLevelTaskScheduler(5);
TaskFactory factory = new TaskFactory(scheduler);
while( !actionQueue.IsEmpty )
{
factory.StartNew( () =>
{
Action action;
if(actionExecution.TryDequeue(out action))
action.Invoke();
}, TaskCreationOptions.LongRunning);
}
关于c# - 如何限制通过并行任务库运行的事件任务的数量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17674184/