如何在 c# 中发出停止的信号线程有异常

本文关键字:信号 信号线 线程 异常 | 更新日期: 2023-09-27 18:36:53

假设有 5 个线程,T1、T2、T3、T4 和 T5,其中 5 个当前正在运行。我的要求是停止所有 4 个线程,以防 5 个线程中的任何一个出现任何异常。如何实现这一点。我正在使用 c# 4.0

如何在 c# 中发出停止的信号线程有异常

这可以通过使用CancelTokens来实现。CancelTokenSource可以在您的线程之间共享。

下面是一个任务示例,但您可以使用线程''线程池

        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示例(包括共享的CancelCancelTokenSources):

编辑:我可能应该提到,与其在请求计算时"中断"循环,不如调用令牌的 ThrowIfCancelRequest 方法。但结果会有所不同 - 任务不会"运行完成",它将处于"已取消"状态。添加任务延续时需要考虑这一点。