8

我有一些 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() );
        }
    }
4

2 回答 2

14

查看 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);
}
于 2013-07-16T10:42:05.333 回答
-1

您将需要指定 ParallelOptions

ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = 4;//value of your choice

if (Parallel.ForEach(PDFFiles, options, element =>
{
   //do work 
}
于 2013-07-16T10:33:46.277 回答