在.net中将线程优先级从最低到最高

Ton*_*Nam 2 c# parallel-processing multithreading thread-priority

我试图通过让一个线程写入链表而另一个线程处理链表来加快速度.

出于某种原因,如果写入链表的方法我将其作为一个任务,并且从链表中读取一个低优先级线程的方法,程序整体上完成的速度要快得多.换句话说,我在做的时候经历了紧固结果:

 Task.Factory.StartNew( AddItems );

 new Thread( startProcessingItems ) { Priority = ThreadPriority.Lowest }.Start();

 while(completed==false)
    Thread.Sleep(0);
Run Code Online (Sandbox Code Playgroud)

也许是因为第一个任务是做了比其他线程更多的额外工作,这就是为什么如果我将第二个方法设置为低优先级,整个事情将会更快完成.

无论如何,现在我的问题是startProcessingItems ThreadPriority =最低的运行.我怎么能把它的优先级改为最高?如果我在该方法中创建一个新任务,它将以低优先级运行吗?基本上,startProcessingItems以列表结束,一旦它具有该列表,我将开始以最高优先级执行.

Ree*_*sey 5

这不是一个好方法.首先,LinkedList<T>它不是线程安全的,所以写入它并在两个线程中读取它将导致竞争条件.

更好的方法是使用BlockingCollection<T>.这允许您添加项目(生产者线程)和读取项目(消费者线程),而不必担心线程安全,因为它完全是线程安全的.

读取线程可以只调用blockingCollection.GetConsumingEnumerable()a foreach来获取元素,而写入线程只是添加它们.读取线程将自动阻塞,因此不需要弄乱优先级.

当写入线程"完成"时,您只需调用CompleteAdding,这将允许读取线程自动完成.

  • @TonoNam 锁定可以解决竞争条件问题,但 BC 好得多。它也可能会表现得更好,因为在大多数情况下,新的 Concurrent 集合比锁定普通集合的表现要好得多。 (2认同)