set priority for Parallel.For loop

前端 未结 5 1645
半阙折子戏
半阙折子戏 2021-01-05 16:21

Ok, here\'s the situation: My main/UI thread (call it Thread1) is used for acquiring a batch of images from a phsycial document scanner. When a batch has been acquired, a se

5条回答
  •  无人及你
    2021-01-05 16:52

    public static void PriorityParallelForeach(this IEnumerable source, Action action, ThreadPriority threadPriority, int? maxDegreeOfParallelism = null)
       {
           if (maxDegreeOfParallelism == null || maxDegreeOfParallelism<1)
           {
               maxDegreeOfParallelism = Environment.ProcessorCount;
           }
    
           var blockingQueue = new BlockingCollection(new ConcurrentQueue(source));
           blockingQueue.CompleteAdding();
    
            var tasks = new List() ;
    
            for (int i = 0; i < maxDegreeOfParallelism; i++)
            {
                tasks.Add(Task.Factory.StartNew(() =>
                 {
                     while (!blockingQueue.IsCompleted)
                     {
                         T item;
                         try
                         {
                             item = blockingQueue.Take();
                         }
                         catch (InvalidOperationException)
                         {
                             // collection was already empty
                             break;
                         }
    
                         action(item);
                     }
                 }, CancellationToken.None,
                      TaskCreationOptions.None,
                      new PriorityScheduler(threadPriority)));
            }
    
            Task.WaitAll(tasks.ToArray());
    
       }
    

    Or just:

    Parallel.ForEach(testList, item =>
                {
    
                    var priviousePrio = Thread.CurrentThread.Priority;
                    // Set your desired priority
                    Thread.CurrentThread.Priority = ThreadPriority.Lowest;
    
                    TestCalc(item);
    
                    //Reset priviouse priority of the TPL Thread
                    Thread.CurrentThread.Priority = priviousePrio;
                });
    

提交回复
热议问题