zoukankan      html  css  js  c++  java
  • 多线程使用

    多线程处理异常:最好在线程内部记录try  catch 并且记录错误信息
    线程取消:CancellationTokenSource cts类里面实现  cts.Cancel();取消线程
     try
                    {
                        CancellationTokenSource cts = new CancellationTokenSource();
                        List<Task> taskList = new List<Task>();
                        for (int i = 0; i < 50; i++)
                        {
                            string name = $"btnThreadCore_Click_{i}";
                            taskList.Add(Task.Run(() =>
                            {
                                try
                                {
                                    if (!cts.IsCancellationRequested)
                                        Console.WriteLine($"This is {name} 开始 ThreadId={Thread.CurrentThread.ManagedThreadId.ToString("00")}");
    
                                    Thread.Sleep(new Random().Next(50, 100));
    
                                    if (name.Equals("btnThreadCore_Click_11"))
                                    {
                                        throw new Exception("btnThreadCore_Click_11异常");
                                    }
                                    else if (name.Equals("btnThreadCore_Click_12"))
                                    {
                                        throw new Exception("btnThreadCore_Click_12异常");
                                    }
                                    else if (name.Equals("btnThreadCore_Click_13"))
                                    {
                                        cts.Cancel();
                                    }
                                    if (!cts.IsCancellationRequested)
                                    {
                                        Console.WriteLine($"This is {name}成功结束 ThreadId={Thread.CurrentThread.ManagedThreadId.ToString("00")}");
                                    }
                                    else
                                    {
                                        Console.WriteLine($"This is {name}中途停止 ThreadId={Thread.CurrentThread.ManagedThreadId.ToString("00")}");
                                        return;
                                    }
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine(ex.Message);
                                    cts.Cancel();
                                }
                            }, cts.Token));
                        }
                        //1 准备cts  2 try-catch-cancel  3 Action要随时判断IsCancellationRequested
                        //尽快停止,肯定有延迟,在判断环节才会结束
    
                        Task.WaitAll(taskList.ToArray());
                        //如果线程还没启动,能不能就别启动了?
                        //1 启动线程传递Token  2 异常抓取  
                        //在Cancel时还没有启动的任务,就不启动了;也是抛异常,cts.Token.ThrowIfCancellationRequested
                    }
                    catch (AggregateException aex)
                    {
                        foreach (var exception in aex.InnerExceptions)
                        {
                            Console.WriteLine(exception.Message);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
    View Code

    线程零时变量

      for (int i = 0; i < 5; i++)
                    {
                        int k = i;
                        Task.Run(() =>
                        {
                            Console.WriteLine($"This is btnThreadCore_Click_{i}_{k} ThreadId={Thread.CurrentThread.ManagedThreadId.ToString("00")}");
                        });
                    }

    线程安全Look  全局零时变量吧多线程变成单线程处理

    for (int i = 0; i < 10000; i++)
    {
    Task.Run(() =>
    {
    lock (Form_Lock)//任意时刻只有一个线程能进入方法块儿,这不就变成了单线程
    {
    this.iNumAsync++;
    }
    });
    }





  • 相关阅读:
    160628、利用Oracle rownum让表排序字段值连续
    160627、你想知道的关于JavaScript作用域的一切
    160624、Spark读取数据库(Mysql)的四种方式讲解
    160623、理解 Promise 的工作原理
    160622、详解JavaScript变量提升
    160621、Java注解教程及自定义注解
    详解JavaScript数组过滤相同元素的5种方法
    box-shadow
    Axios 中文说明
    一步一步学Vue(九) 路由元数据
  • 原文地址:https://www.cnblogs.com/zxp6/p/11147649.html
Copyright © 2011-2022 走看看