我是一个菜鸟,我只是在努力,2021正视自己,面对2021!

多线程学习笔记第二篇

   前言:这篇博客主要是在上一篇博客的基础上,重新复习了一下上一篇博客的内容,讲解了一些特殊的使用,并且使用了大量的案例来说明,主要说明了异步委托的使用和回调函数执行异步委托以及跨线程访问控件的解决方案和一个双色球的案例。这篇文章我以代码的形式写了,里面有大量的注释,我们可以详细的研究,很高兴能和你们一起研究。

1.线程的复习

  (1) 多线程Thread调用委托方法的实现Demo

       class Program

       {

              static void Main(string[] args)

              {

                     Thread thread = new Thread(new ThreadStart(DemoMethod));

                     //设置线程参数

                     thread.IsBackground = true; //后台线程,常用的都是后台线程

                     //设置线程的名字

                     thread.Name = "给开发人员用的";

                     //设置线程的优先级(只是提议)

                       thread.Priority = ThreadPriority.Highest; //0-31

                     //启动线程,只是告诉操作系统线程准备好,开始执行此线程,但是并不一定线程立即执行

                     thread.Start();

                     Thread.Sleep(3000);

                     Console.ReadKey();

              }

              private static void DemoMethod()

                {

                     Console.WriteLine("执行的工作线程是:{0}", Thread.CurrentThread.ManagedThreadId); ;

              }

      }

       执行结果是:执行的工作线程是:10

  (2)线程配合Lambda表达式的使用

       static void Main(string[] args)

     {

        //第一种写法

       Thread thread = new Thread(new ThreadStart(() =>

      {

          Console.WriteLine("执行的工作线程是:{0}", Thread.CurrentThread.ManagedThreadId); ;

       }));

       //第二种写法

      new Thread(() =>

      {

           Console.WriteLine("执行的工作线程是:{0}", Thread.CurrentThread.ManagedThreadId); ;

       }).Start();

      //设置线程参数

       thread.IsBackground = true; //后台线程,常用的都是后台线程

       //设置线程的名字

       thread.Name = "给开发人员用的";

       //设置线程的优先级(只是提议)

       thread.Priority = ThreadPriority.Highest; //0-31

       //启动线程,只是告诉操作系统线程准备好,开始执行此线程,但是并不一定线程立即执行

        thread.Start();

        Thread.Sleep(3000);

       Console.ReadKey();

  }

       //执行结果是:

            //执行的工作线程是:4

            //执行的工作线程是:3

  (3)带参数的线程执行

       static void Main(string[] args)

     {

        //定义带参数的线程

        Thread thread = new Thread(new ParameterizedThreadStart(ParameterMethodDemo));

        //开启线程,传递参数

        thread.Start("韩迎龙");

        Thread.Sleep(3000);

      }

      private static void ParameterMethodDemo(object obj)

      {

         Console.WriteLine("执行一个带参数的线程方法:{0}", obj);

      }

      //执行结果:执行一个带参数的线程方法:韩迎龙

  (4)异步委托回调函数的使用

       namespace ReviewThread

       {

              //定义委托

              internal delegate int AddDel(int a,int b);

             class Program

              {

                     static void Main(string[] args)

                     {

                            //定义委托变量的时候,如果是指向第一个方法,那么必须使用new关键字

                            AddDel del = new AddDel(Demo);

                            //同步调用

                            //int res = del(5, 3);

                            //异步调用,本质就是重新开启一个线程帮我们,执行委托的方法

                            //内部:开启一个新的线程执行委托

                            IAsyncResult result = del.BeginInvoke(2, 5, null, null);

                              //执行主线程要干的事情

                            //异步委托的好处是:不阻塞主线程

                            int methodRes = del.EndInvoke(result);

                            Console.WriteLine(methodRes);

                            Console.ReadKey();

                       }

                     public static int Demo(int a, int b)

                     {

                            return a + b;

                     }

                     //执行结果:7

              }

       }

2. 委托的异步调用:由另一个线程执行委托的方法

  (1) 简单的异步委托调用Demo

     namespace AsyncDelegate

     {

    internal delegate int AddDemoDel(int a,int b);

            class Program

            {

                   static void Main(string[] args)

                   {

                      Console.WriteLine("当前主线程是:{0}", Thread.CurrentThread.ManagedThreadId);

                      AddDemoDel addDemoDel = new AddDemoDel(AddDemo);

                           //委托的异步调用

                             //开始调用委托方法,自动创建一个线程并执行委托的方法

                             IAsyncResult result = addDemoDel.BeginInvoke(4, 5, null, null);

                             //得到委托的返回值

                             int inta = addDemoDel.EndInvoke(result); //阻塞当前主线程,只等到子线程执行完成,并返回方法的返回值之后继续执行

                             Console.WriteLine("主线程执行完毕,结果是" + inta);

                             Thread.Sleep(10000);

                             Console.ReadKey();

                      }

                      private static int AddDemo(int a, int b)

                      {

                             Thread.Sleep(3000);

                             Console.WriteLine("当前执行的线程是:{0}", Thread.CurrentThread.ManagedThreadId);

                             return a + b;

                      }

                      //执行结果:

                          //当前主线程是:9

                          //当前执行的线程是:10

                          //主线程执行完毕,结果是9

               }

            }

  (2)设置一个回调函数执行异步委托

            namespace AsyncDelegate

            {

               internal delegate int AddDemoDel(int a,int b);

               class Program

               {

                      static void Main(string[] args)

                      {

                             Console.WriteLine("当前主线程是:{0}", Thread.CurrentThread.ManagedThreadId);

                             AddDemoDel addDemoDel = new AddDemoDel(AddDemo);

                             //指定回调函数,处理的异步委托

                             addDemoDel.BeginInvoke(3, 4, new AsyncCallback(DelCallBackFuncDemo), "韩迎龙");

                             Console.WriteLine("主线程执行完毕");

                             Console.ReadKey();

                      }

                      //定义一个委托单额回调方法

                      public static void DelCallBackFuncDemo(IAsyncResult arr)

                      {

                             Console.WriteLine("回调函数执行的线程是:{0}", Thread.CurrentThread.ManagedThreadId);

                             //当我们的委托方法执行完成后,会自动调用次回调函数

                             AsyncResult result=(AsyncResult)arr;

                             Console.WriteLine("在回调方法里面获取到的传递过来的状态:{0}",result.AsyncState);

                             //回调函数获取当前委托方法执行的结果

                             AddDemoDel del = (AddDemoDel)result.AsyncDelegate; //将异步委托转成我们自定义的委托类型

                             int funResult = del.EndInvoke(result); //获取方法的返回值

                             Console.WriteLine("获取到当前方法执行的结果是:{0}", funResult);

                      }

                      private static int AddDemo(int a, int b)

                      {

                             Thread.Sleep(3000);

                             Console.WriteLine("当前执行的线程是:{0}", Thread.CurrentThread.ManagedThreadId);

                             return a + b;

                      }

               }

            }

            //执行结果如图所示:

      

3. 一个双色球变化的案例

  (1) 创建一个Windows窗体应用程序(Winform),起名为DoubleBallDemo,拖放一个Button控件

  (2)项目Demo代码结果如下:

(2) 项目显示截图:

           

posted @   Kencery  阅读(1788)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
友情链接:初心商城
点击右上角即可分享
微信分享提示