我有一个应用程序,用户将选择执行许多任务以及最大线程数.每个任务应该在一个单独的线程上运行.这是我正在寻找的:
如果用户指定"n小于t",其中n是最大线程数,t是任务数.程序应运行"n"个线程,完成后,应通过某种方式通知程序并重复循环,直到完成所有任务.
我的问题是:如何知道所有正在运行的线程已完成其工作,以便我可以重复循环.
Jul*_*iet 10
我建议使用ThreadPool完成任务.它的算法通常比你可以手动滚动的效率更高.
现在,当所有线程完成时,有趣的部分会收到通知.除非你有真正特定的需求使这个解决方案不合适,否则应该很容易用CountdownEvent类实现,这是一种特殊的等待句柄,等待它被发出信号的n时间.这是一个例子:
using System;
using System.Linq;
using System.Threading;
using System.Diagnostics;
namespace CSharpSandbox
{
class Program
{
static void SomeTask(int sleepInterval, CountdownEvent countDown)
{
try
{
// pretend this did something more profound
Thread.Sleep(sleepInterval);
}
finally
{
// need to signal in a finally block, otherwise an exception may occur and prevent
// this from being signaled
countDown.Signal();
}
}
static CountdownEvent StartTasks(int count)
{
Random rnd = new Random();
CountdownEvent countDown = new CountdownEvent(count);
for (int i = 0; i < count; i++)
{
ThreadPool.QueueUserWorkItem(_ => SomeTask(rnd.Next(100), countDown));
}
return countDown;
}
public static void Main(string[] args)
{
Console.WriteLine("Starting. . .");
var stopWatch = Stopwatch.StartNew();
using(CountdownEvent countdownEvent = StartTasks(100))
{
countdownEvent.Wait();
// waits until the countdownEvent is signalled 100 times
}
stopWatch.Stop();
Console.WriteLine("Done! Elapsed time: {0} milliseconds", stopWatch.Elapsed.TotalMilliseconds);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12829 次 |
| 最近记录: |