//当其中一个线程异常之后 之后的线程都取消
多线程里面抛出的异常只会终结当前线程,不会影响其他线程
try
{
List<Task> list2 = new List<Task>();
CancellationTokenSource cts = new CancellationTokenSource();
for (int i = 0; i < 50; i++)
{
string name = i + "线程";
list2.Add(Task.Run(() =>
{
try
{
if (!cts.IsCancellationRequested)
Console.WriteLine(name + "开始");
Thread.Sleep(new Random().Next(50, 100));
if (name == "11线程" || name == "12线程")
{
cts.Cancel();
throw new Exception(name + "异常");
}
if (!cts.IsCancellationRequested)
Console.WriteLine(name + "结束");
else
Console.WriteLine(name + "被取消");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
cts.Cancel();
}
}, cts.Token)); // cts.Token的作用:在cts.Cancel() 之后会抛出异常,即将cts.Cancel()之后的任务取消 cts.Cancel() 时还没有启动的任务就不启动了
}
Task.WaitAll(list2.ToArray());//1:捕捉到异常的线程
}
catch (AggregateException ex)//2 通过try catch AggregateException 遍历
{
foreach (var item in ex.InnerExceptions)
{
Console.WriteLine(item.Message);
}
}
catch (Exception ex)
{ }