首页 > 其他分享 >ThreadCore学习

ThreadCore学习

时间:2024-08-18 17:27:34浏览次数:11  
标签:btnThreadCore Task Console string ThreadCore 学习 线程 WriteLine

1.线程中的异常处理

一般线程里面不允许出现异常,需要自己处理好,最好在线程里加个try catch,

                #region 异常处理
                //线程里面的异常是被吞掉了,因为已经脱离了try 的范围了, WaitAll 抓到多线程里面全部的异常
                //线程里面不允许出现异常,自己处理好,最好在线程里加个try catch
                for (int i = 0; i < 20; i++)
                {
                    string name = string.Format($"btnThreadCore_Click_{i}");
                    Action<object> act = t =>
                    {
                            //try
                            //{
                            Thread.Sleep(2000);
                        if (t.ToString().Equals("btnThreadCore_Click_11"))
                        {
                            throw new Exception(string.Format($"{t}执行失败"));
                        }
                        if (t.ToString().Equals("btnThreadCore_Click_12"))
                        {
                            throw new Exception(string.Format($"{t}执行失败"));
                        }
                        Console.WriteLine("{0}执行成功", t);
                            //}
                            //catch (Exception ex)
                            //{
                            //    Console.WriteLine(ex.Message);
                            //}
                        };
                    taskList.Add(taskFactory.StartNew(act, name));
                }
                Task.WaitAll(taskList.ToArray());
            }

除此之外,可以在主线程中加个Try Catch ,使用AggregaException 进行捕获异常,注意try中要使用Task.WaitAll ,保证线程都运行完成,才能捕获得到

        try
{
       //多线程操作
Task.WaitAll(taskList.ToArray());
}
catch (AggregateException aex) { foreach (var item in aex.InnerExceptions) { Console.WriteLine(item.Message+"jj"); } }

2.线程取消:CancellationTokenSource

                //多个线程并发,某个失败后,希望通知别的线程,都停下来
                //task是外部无法中止的
                //线程自己停止自己--公共的访问变量--修改它--线程不断的检测它
                //CancellationTokenSource去标志任务是否取消, Cancal 取消  IsCancellationRequested 是否已经取消了
                //Token 启动Task的时候传入,那么如果Cancel了,这个任务会放弃启动,抛出一个异常
                CancellationTokenSource cts = new CancellationTokenSource();//bool值
                for (int i = 0; i < 40; i++)
                {
                    string name = string.Format("btnThreadCore_Click{0}", i);
                    Action<object> act = t =>
                    {
                        try
                        {
                            Thread.Sleep(2000);
                            if (t.ToString().Equals("btnThreadCore_Click11"))
                            {
                                throw new Exception(string.Format("{0}执行失败", t));
                            }
                            if (t.ToString().Equals("btnThreadCore_Click12"))
                            {
                                throw new Exception(string.Format("{0}执行失败", t));
                            }
                            if (cts.IsCancellationRequested)
                            {
                                Console.WriteLine("{0}放弃执行", t);
                                return;
                            }
                            else
                            {
                                Console.WriteLine("{0}执行成功", t);
                            }
                        }
                        catch (Exception ex)
                        {
                            cts.Cancel();
                            Console.WriteLine(ex.Message + "oo");
                        }
                    };
                    taskList.Add(taskFactory.StartNew(act, name, cts.Token));
                }
                Task.WaitAll(taskList.ToArray());

3.多线程临时变量需注意

                //全程就只有一个i
                //全程有5个k
                for (int i = 0; i < 5; i++)
                {
                    int k = i;
                    Task.Run(() =>
                    {
                        Thread.Sleep(100);
                        Console.WriteLine(k);
                    });
                }

4.线程安全:使用lock

                //lock 解决,因为只有一个线程可以进去,没有并发,所以解决了问题,但是牺牲了性能
                //安全队列  ConcurrentQueue  一个线程去完成操作
                //
                for (int i = 0;i< 10000; i++)
                {
                    int newI = i;
                    taskList.Add(taskFactory.StartNew(() => 
                    {
                        lock (btnThreadCore_Click_Lock)//lock后的方法块,任意时刻只有一个线程可以进入,只能锁引用类型,不要用string,因为享元
                        {
                            TotalCount += 1;
                            IntList.Add(newI);
                        }

                        Monitor.Enter(btnThreadCore_Click_Lock); //和lock一样的效果
                        Monitor.Exit(btnThreadCore_Click_Lock);
                        
                    }));
                }
                Task.WaitAll(taskList.ToArray());
                Console.WriteLine(TotalCount);
                Console.WriteLine(IntList.Count());

 5.Asyc await会成对使用,使用之后,方法名前也要加个Task;当遇到await后,后返回到主线程运行,当task的逻辑执行完之后,后执行方法后的逻辑

        private static async Task<long> SumAsync()
        {
            Console.WriteLine("SumAsync 1111 start");
            long result = 0;
            await Task.Run(() =>
            {
                for (int k = 0; k < 10; k++)
                {
                    Console.WriteLine($"SumAsync {k} await Task.Run ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
                    Thread.Sleep(1000);
                }
                for(long i = 0; i < 999999; i++)
                {
                    result += i;
                }
            });
            Console.WriteLine($"SumFactory 111 end ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
            return result;
        }
                Task<long> t = SumAsync();
                long lResult = t.Result;//这种也会等子线程,获取返回值,等待的部分相当于t.wait()
                t.Wait();

 

标签:btnThreadCore,Task,Console,string,ThreadCore,学习,线程,WriteLine
From: https://www.cnblogs.com/guoxu486/p/18362065

相关文章

  • PyTorch深度学习实战(18)—— 可视化工具
    在训练神经网络时,通常希望能够更加直观地了解训练情况,例如损失函数曲线、输入图片、输出图片等信息。这些信息可以帮助读者更好地监督网络的训练过程,并为参数优化提供方向和依据。最简单的办法就是打印输出,这种方式只能打印数值信息,不够直观,同时无法查看分布、图片、声音等......
  • C++学习第二课
    一、C++数据类型使用编程语言进行编程时,我们需要用到各种变量来存储各种信息,变量保留的时他所存储的值的内存位置,这意味着,你创建一个变量时,就会在内存中保留一些空间。在我们的编程中我们一般需要的数据类型有比如字符型、宽字符型、整型、浮点型、双浮点型、布尔型等,操作系......
  • 初识指针2の学习笔记
    目录1>>前言2>>野指针2.1>>野指针是如何形成的?2.2>>那么我们如何规避野指针呢?3>>assert断言4>>指针的传地址调用5>>数组名的理解6>>数组and指针的等价打印7>>结语1>>前言    今天我会继续分享一些我做的笔记,以及我对指针的理解,后续会持续分享指针几天,......
  • 【学习笔记】珂朵莉树
    前言珂朵莉树(ChthollyTree),又名老司机树(OldDriverTree),起源自CF896CWillem,ChthollyandSeniorious。严格来说,珂朵莉树这种想法是基于数据随机的颜色段均摊,而不是一种数据结构,可作为一些题目的暴力做法(因此原题被分到了暴力数据结构的标签),在随机数据下一般效率较高。基......
  • python入门机器学习4:pandas入门
     一.Series:一维数组,listimportnumpyasnpimportpandasaspdmyarray=np.array([1,2,3])myindex=['a','b','c']myseries=pd.Series(myarray,index=myindex)print(myseries)print(myseries[0])#第一个元素print(myseries['c'])#in......
  • 物理 选择性必修一 第三章 学习笔记
    1.波的形成振动的传播称为波动,简称波(wave)。我们把物体或物体的一部分在一个位置附近的往复运动称为机械振动(mechanicalvibration),简称振动。(X1-2)以抖动绳子为例,绳子是有弹性的物体,设想把一条绳子分成一个个小段,这些小段可以看作一个个相连的质点。当手握绳端上下振动时,绳端带......
  • 计算机毕业设计选题推荐-在线学习平台-Java/Python项目实战
    ✨作者主页:IT研究室✨个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。☑文末获取源码☑精彩专栏推荐⬇⬇⬇Java项目Python项目安卓项目微信小程序项目......
  • Markdown学习
    标题这是一个二级标题##这是一个二级标题这是一个三级标题###这是一个三级标题字体这是一段普通文本这是一段粗体文本**这是一段粗体文本**这是一段斜体文本*这是一段斜体文本*这是一段粗体且斜体文本***这是一段粗体且斜体文本***这段文本应用了删除线~~这......
  • FreeRTOS学习:任务调度
     注:在使用大多数功能时,FreeRTOS都要将对应的宏置为1,具体的需要查看FreeRTOS官方文档。 任务堆栈相关寄存器如下,启动第一个任务FreeRTOS中启动第一个任务的流程总结如下,启动任务调度器vTaskStartScheduler()在该函数中会创建空闲任务prvIdleTask和软件定时器任务xTimerC......
  • 零基础学习人工智能—Python—Pytorch学习(五)
    前言上文有一些文字打错了,已经进行了修正。本文主要介绍训练模型和使用模型预测数据,本文使用了一些numpy与tensor的转换,忘记的可以第二课的基础一起看。线性回归模型训练结合numpy使用首先使用datasets做一个数据X和y,然后结合之前的内容,求出y_predicted。#pipinstallmatp......