【问题标题】:How to signal threads to stop in c# in any one has exception如何在任何一个有异常的c#中通知线程停止
【发布时间】:2013-10-25 07:25:28
【问题描述】:

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

【问题讨论】:

  • 你能在这里放一些代码吗?,
  • 创建一个所有线程都可以访问的布尔标志(类变量)..如果有异常设置该标志..所有其他线程检查该标志将相应停止
  • 你能有一个带有“Crasched”标志的单例类(或静态类)吗?该标志应由具有异常的线程之一在某些 catch 语句中设置。然后其他线程应定期轮询该标志。或者,您可以调用一个“ThreadFactoryClass”来创建线程。创建线程时,应将其放入 crated 线程列表中。当您的一个线程崩溃时,您在“ThreadFactoryClass”上调用“StopAllThreads”方法。该方法将遍历列表并在所有线程上调用 Abort。
  • 活动不是更合适吗?在catch 语句中调用事件并让该事件取消所有线程。

标签: c# .net multithreading c#-4.0


【解决方案1】:

这可以通过使用 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);

并查看this 链接,其中包含很多 CalcellationTokenSource 示例(包括共享的 CancellationCancellationTokenSources):

编辑: 我可能应该提到,当请求取消时,您可以调用 Token 的 ThrowIfCancellationRequested 方法,而不是“打破”循环。结果会有所不同 - 任务不会“运行到完成”,它将处于“已取消”状态。添加任务延续时需要考虑这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-19
    • 2010-11-10
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    相关资源
    最近更新 更多