【问题标题】:process list items in different threads处理不同线程中的列表项
【发布时间】:2010-03-06 21:26:17
【问题描述】:

目前,我有排队等待按顺序处理的作业对象列表,如下面的代码所示。

   List<Job> jobList = jobQueue.GetJobsWithStatus(Status.New);
   foreach (Job job in jobList)
   {               
        job.Process();
   }

我有兴趣在有限数量的线程中同时运行多个作业(比如说 5 个线程)。

在 c# 中最好的方法是什么?

补充说明:

  • Job 对象不共享资源 与其他工作。
  • 每个 Job 大约需要 10 秒 过程。
  • 每个作业都可以连接到 不同的资源。

更新:我使用了 Semaphore,因为我无法使用 ThreadPool 限制活动线程的数量。

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    如果您喜欢冒险,可以使用 C# 4.0 和任务并行库:

    Parallel.ForEach(jobList, curJob => {
      curJob.Process()
    });
    

    【讨论】:

    • 非常有趣的 Sid,目前我正在使用带有 .NET 3.5 的 Visual Studio 2008。可悲的是,在它成为金牌之前,我认为我无法在正式服务器上使用 4.0。
    • 可以理解,我仍然坚持使用 .NET 2.0 :(
    【解决方案2】:

    您将需要研究线程池(为了简单的答案)。 C# 中甚至还有一个 ThreadPool 类,它很容易通过 msdn library 中的优秀示例进行设置。

    【讨论】:

      【解决方案3】:

      ThreadPool.QueueUserWorkItem()

      这会将一个方法排队等待执行。它会在线程池线程可用时执行。

      【讨论】:

        【解决方案4】:

        如果你打算使用线程,简单的编码:

        private static void TransferThread(ThreadStart tstart)
                {
                    Thread thread = new Thread(tstart);
                    thread.IsBackground = true;
                    thread.Start();
        }
        

        或者你可以ThreadPool。这允许您使用任何可用的线程并在完成后将其返回到池中。

        【讨论】:

          【解决方案5】:

          我会试试 .NET 线程池。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-08-19
            • 1970-01-01
            • 2011-11-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多