我有一个需要处理的 10 个项目的列表,每个项目使用一个单独的线程。代码应该是这样的:
foreach (Item item in items)
{
Thread t = new Thread(() =>
{
ProcessItem(item);
});
t.Start();
}
我还需要暂停线程(1 秒减去执行线程所需的时间)。在这种情况下我应该使用 Thread.Sleep 吗?
我有一个需要处理的 10 个项目的列表,每个项目使用一个单独的线程。代码应该是这样的:
foreach (Item item in items)
{
Thread t = new Thread(() =>
{
ProcessItem(item);
});
t.Start();
}
我还需要暂停线程(1 秒减去执行线程所需的时间)。在这种情况下我应该使用 Thread.Sleep 吗?
如果您不介意跳过手动处理线程,以下行应该完全符合您的要求:
Parallel.ForEach(items, ProcessItem);
或者在处理每个之前睡觉(尽管这没有多大意义):
Parallel.ForEach(items, item => { Thread.Sleep(1000); ProcessItem(item); });
您将使用Thread.Join
等待其他线程完成它们的工作。
Thread.Sleep
基本上会等待指定的毫秒数
Thread.Sleep
确实有副作用,不推荐。
在您的上下文中需要注意的几点:
items
增加?)也检查ThreadPooling
andthread-safe
操作。
启动线程的代码看起来不错。
您将不得不使用Thread.Sleep(duration in milliseconds)
使线程暂停一段时间。
Join
将暂停当前线程,直到您加入的线程未完成其处理。
如果出于某种原因不想使用以下内容,请使用以下内容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();
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.