c#Threads和Thread.Join

时间:2013-10-21 12:17:26

标签: c# multithreading parallel-processing

我有一个需要处理的10个项目的列表,每个项目都使用一个单独的线程。代码应该是这样的:

foreach (Item item in items)
{
    Thread t = new Thread(() =>
    {
        ProcessItem(item);
    });
    t.Start();
}

我还需要暂停线程(1秒减去执行线程所花费的时间)。在这种情况下我应该使用Thread.Sleep吗?

5 个答案:

答案 0 :(得分:5)

如果您不介意跳过线程的手动处理,则以下行应该完全符合您的要求:

Parallel.ForEach(items, ProcessItem);

或在处理之前睡觉(虽然这没有多大意义):

Parallel.ForEach(items, item => { Thread.Sleep(1000); ProcessItem(item); });

答案 1 :(得分:0)

您将使用Thread.Join等待其他线程完成其工作。

Thread.Sleep基本上会等待指定的毫秒

的数量

Thread.Sleep确实有副作用,不推荐使用。

您需要注意的一些要点:

  1. 如果没有可用的线程(如果items的数量增加?)
  2. ,该怎么办?
  3. 线程是否访问某些共享资源?
  4. 也可以查看ThreadPoolingthread-safe操作。

答案 2 :(得分:0)

启动线程的代码看起来很好。

您必须使用Thread.Sleep(duration in milliseconds)让线程暂停一段时间。

Join将暂停当前线程,直到您加入的线程未完成其处理。

答案 3 :(得分:0)

如果由于某种原因您不想使用Parallel.ForEach,请使用以下内容:

Thread[] threads = new Thread[10];
int count = 0;
foreach (Item item in items)
{
    Thread t = new Thread(() =>
    {
        ProcessItem(item);
    });
    t.Start();
    threads[count++]=t;
}
for (int i=0;i<10;++i)
    threads[i].Join();

答案 4 :(得分:0)

使用Thread.Sleep

Thread.SleepThread.Join是不同的东西。

Thread.Sleep阻止(停止)当前线程一段时间。

Thread.Join阻止(停止)当前线程,直到调用Join的线程结束。


另外,请考虑使用Parallel.ForEach作为@nvoigt建议。