假设有 5 个线程,T1、T2、T3、T4 和 T5,其中 5 个当前正在运行。我的要求是停止所有 4 个线程,以防 5 个线程中的任何一个出现异常。这怎么可能实现。我正在使用 c# 4.0
问问题
3236 次
1 回答
7
这可以通过使用 CancellationTokens 来实现。CancellationTokenSource 可以在您的线程之间共享。
这是一个任务示例,但您可以使用 Threads\ThreadPool
CancellationTokenSource cts = new CancellationTokenSource();
Task.Factory.StartNew(() =>
{
while (1 == 1)
{
Thread.Sleep(1000);
Console.WriteLine("Thread1 in progress...");
if (cts.Token.IsCancellationRequested)
{
Console.WriteLine("Thread1 exiting...");
break;
}
}
}, cts.Token);
Task.Factory.StartNew(() =>
{
while (1 == 1)
{
Thread.Sleep(1000);
Console.WriteLine("Thread2 in progress...");
if (cts.Token.IsCancellationRequested)
{
Console.WriteLine("Thread2 exiting...");
break;
}
}
}, cts.Token);
Task.Factory.StartNew(() =>
{
while (1 == 1)
{
Thread.Sleep(1000);
Console.WriteLine("Thread3 in progress...");
if (cts.Token.IsCancellationRequested)
{
Console.WriteLine("Thread3 exiting...");
break;
}
}
}, cts.Token);
Task.Factory.StartNew(() =>
{
Thread.Sleep(5000);
try
{
Console.WriteLine("Thread5 in progress...");
int y = 0;
int x = 1 / y;
}
catch
{
Console.WriteLine("Thread5 requesting cancellation...");
cts.Cancel();
}
}, cts.Token);
并查看此链接,其中包含很多 CalcellationTokenSource 示例(包括共享的 CancellationCancellationTokenSources):
编辑:我可能应该提到,当请求调用时,您可以调用令牌的 ThrowIfCancellationRequested 方法,而不是“打破”循环。结果会有所不同 - 任务不会“运行到完成”,它将处于“已取消”状态。添加任务延续时需要考虑这一点。
于 2013-10-25T08:53:21.630 回答