1

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

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

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

4

5 回答 5

5

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

Parallel.ForEach(items, ProcessItem);

或者在处理每个之前睡觉(尽管这没有多大意义):

Parallel.ForEach(items, item => { Thread.Sleep(1000); ProcessItem(item); });
于 2013-10-21T12:20:29.857 回答
0

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

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

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

在您的上下文中需要注意的几点:

  1. 如果没有更多可用线程怎么办(如果数量items增加?)
  2. 线程是否访问某些共享资源?

也检查ThreadPoolingandthread-safe操作。

于 2013-10-21T12:20:49.057 回答
0

启动线程的代码看起来不错。

您将不得不使用Thread.Sleep(duration in milliseconds)使线程暂停一段时间。

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

于 2013-10-21T12:20:59.533 回答
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();
于 2013-10-21T12:24:36.953 回答
0

Use Thread.Sleep.

Thread.Sleep and Thread.Join are different things.

Thread.Sleep blocks (stops) the current thread for a certain time.

Thread.Join blocks (stops) the current thread until the one which Join was called finishes.


Also, consider using Parallel.ForEach as @nvoigt suggested.

于 2013-10-21T12:27:34.970 回答