【问题标题】:.net application multi-threading.net 应用程序多线程
【发布时间】:2012-10-11 15:50:31
【问题描述】:

我有一个多核 cpu,但我编写的 .net 应用程序只使用其中一个内核。当该选项可用时,我如何使其使用多个核心。

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    这不是免费的。使用多个内核需要使用多个线程。您必须为您的程序显式添加线程支持才能同时使用多个内核。

    这是一篇很棒的文章,探讨了如何使用任务并行库(也称为 parallel extensions framework)通过托管代码利用多核。

    http://msdn.microsoft.com/en-us/magazine/cc163340.aspx

    【讨论】:

      【解决方案2】:

      您可以尝试 JaredPar 提到的 Microsoft Parallel Extensions to .NET Framework 3.5,或者自己创建程序的多线程版本。

      我想在这里添加一个更具体的示例,说明将现有程序中的“for-loop”转换为使用并行扩展中的 System.Threading.Parallel 是多么容易。对于检查 0 到 maxnum 之间的每个素数的 for 循环:

      System.Threading.Parallel.For(0, maxNum + 1, x => IsPrime(x));  
      

      很简单,不是吗?

      我还针对从 System.Parallel 获得的性能改进进行了一个简单的基准测试。如果我将链接发布到我的博客 here,我希望 SO 同行不要介意。

      【讨论】:

        【解决方案3】:

        @JaredPar 给出一个excellent answer。但是,在某些情况下,我们可能不值得将代码重写为多线程。多线程代码更复杂,并添加了一大堆额外类型的错误来解决。

        但是,在桌面应用程序的简单情况下,有时值得让双核机器的第二个内核空闲,以便操作系统可以使用它来执行诸如为其他应用程序重绘屏幕、运行病毒扫描等。

        不是你特别想听到的答案,但在某些情况下是一个务实的答案。

        【讨论】:

          【解决方案4】:

          将您的时间密集型作业分派给多个线程。

          多线程的建议方法是使用线程池。

          来自 MSDN 的 ThreadPool 示例:

          using System;
          using System.Threading;
          public class Example {
              public static void Main() {
          
                  // Queue the task.
                  ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));
          
                  Thread.Sleep(1000);
          
                  Console.WriteLine("Main thread exits.");
              }
          
              // This thread procedure performs the task. 
              static void ThreadProc(Object stateInfo) {
          
                  // No state object was passed to QueueUserWorkItem, so  
                  // stateInfo is null.
                  Console.WriteLine("Hello from the thread pool.");
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2012-03-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多