C# 如何在不同的核心上分割长任务?
我是多线程的新手。我的计算机上有4个逻辑进程,我想在4个不同内核上的线程中运行4个相同的任务。我怎么做? 我尝试使用C# 如何在不同的核心上分割长任务?,c#,multithreading,C#,Multithreading,我是多线程的新手。我的计算机上有4个逻辑进程,我想在4个不同内核上的线程中运行4个相同的任务。我怎么做? 我尝试使用BackgroundWorker,但是BackgroundWorker的4个实例只填充了4个可用的核心中的2个。 我的BackgroundWorker代码示例: BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandler(worke
BackgroundWorker
,但是BackgroundWorker的4个实例只填充了4个可用的核心中的2个。
我的BackgroundWorker代码示例:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerAsync(calculationParams);
BackgroundWorker worker1 = new BackgroundWorker();
worker1.DoWork += new DoWorkEventHandler(worker_DoWork);
worker1.RunWorkerAsync(calculationParams1);
BackgroundWorker worker2 = new BackgroundWorker();
worker2.DoWork += new DoWorkEventHandler(worker_DoWork);
worker2.RunWorkerAsync(calculationParams2);
BackgroundWorker worker3 = new BackgroundWorker();
worker3.DoWork += new DoWorkEventHandler(worker_DoWork);
worker3.RunWorkerAsync(calculationParams3);
如果使用任务,则可以为任务设置处理器相关性。请查看以下帖子: 我不认为你能用
BackgroundWorker
做到这一点。您应该使用线程或任务
另一篇你可能会感兴趣的帖子是:。原因可能在于你调用了
逻辑过程。例如,如果在
上有超线程,那么使用额外的逻辑(而不是物理)内核可能没有任何优势为什么在不同的内核上运行函数很重要?@JensKloster有一个很好的观点。让.NET为您管理线程的最佳分布。Igor回答中的一个链接指出:TPL动态地扩展并发度,以有效地使用所有可用的核心。通过使用TPL,您可以最大限度地提高代码的性能,同时专注于程序设计要完成的工作。
@Jens Kloster,我需要计算长任务,现在我发现我的处理器有50%是空闲的。我想减少计算时间如果您使用的是.NET 4.5,那么您应该只使用TPL,而不是自己管理线程。事实证明.NET在这方面做得相当好,所以你不必这么做。我的计算机上有“超线程”,现在我在所有4个内核上都运行任务执行,但