我对线程有点陌生,因为到目前为止,我从未在高级级别上需要过它。
我有以下问题需要解决:
我有一个应用程序,您可以指定它应该使用多少线程,然后启动它。
我知道ThreadPool可以做到这一点,但我需要更多的功能,我不知道如何实现它,所以它会在所有线程完成时进行回调,并在需要时停止所有线程和队列。
一个想法是制作一个新线程,并从那里使用线程池,这样当我杀死威胁时,它杀死的是从该线程开始的威胁(作为主线程)。同样,通过这种方式,我可以将其设置为在队列被清除时回调(单个线程)。
您可以使用Task
s和CancellationToken
s:
var taskCount = 10;
var cancellationTokenSource = new CancellationTokenSource();
for (int i = 0; i < taskCount ; i++)
{
var cancellationToken = cancellationTokenSource.Token;
Task.Factory.StartNew(() =>
{
// do work here.
// Also periodically check
if( cancellationToken.IsCancellationRequested )
return;
// or wait on wait handle
cancellationToken.WaitHandle.WaitOne(timeout);
}, cancellationToken);
}
// to cancel all threads
cancellationTokenSource.Cancel();
同时运行的线程数由TaskFactory中的ThreadPool根据机器报告的CPU内核为您管理。如果你想要更多的控制,我相信可以提供你自己的自定义任务工厂。