• C# 并行线程调用


    参考

    一、异步委托开启线程

      Action<int, int> a = add;
                a.BeginInvoke(3, 4, null, null);//前两个是add方法的参数,后两个可以为空
                Console.WriteLine("main()");
                Console.ReadKey();
    
    
      static void add(int a, int b)
            {
                Console.WriteLine(a + b);
            }

    如果不是开启线程,像平常一样调用的话,应该先输出7,再输出main()

    二、通过thread类开启线程

                new Thread(() =>
                {
                    DTTEST();
                })
                { IsBackground = true }.Start();
                new Thread(() =>
                {
                    DTTEST();
                })
                { IsBackground = true }.Start();
                new Thread(() =>
                {
                    DTTEST();
                })
                { IsBackground = true }.Start();
    
                Thread.Sleep(10000);
    
    
            static private void DTTEST()
            {
    
                Console.WriteLine($"测试并行调用{DateTime.Now}");
            }

    或者

                Thread thread = new Thread(() =>
                {
                    while (true)
                    {
                        Thread.Sleep(1000);
                        DTTEST();
                    }
                });
                thread.Start();

    三、通过线程池开启线程

                var param = "哈哈";
                ThreadPool.QueueUserWorkItem(obj =>
                {
                        // DTTEST(param);
                        CallbackDemoViod(obj);
                }, param);
                ThreadPool.QueueUserWorkItem((o) =>
                {
                    DTTEST(param);
                });
    
           private static void CallbackDemoViod(object obj)
            {
                //以下不catch异常就会导致闪退
                try
                {
                    Console.WriteLine(obj.ToString());
                }
                catch (Exception ex)
                {
    
                    Console.WriteLine(ex);
                }
              
            }
            static private void DTTEST(string a)
            {
                try
                {
                    Console.WriteLine(a);
                }
                catch (Exception ex)
                {
    
                    Console.WriteLine(ex);
                }
            }

    或者

                var param = "哈哈";
                ThreadPool.QueueUserWorkItem(CallbackDemoViod, param);//这种写法方法体参数必须为object
    
            private static void CallbackDemoViod(object obj)
            {
                //以下不catch异常就会导致闪退
                try
                {
                    Console.WriteLine(obj.ToString());
                }
                catch (Exception ex)
                {
    
                    Console.WriteLine(ex);
                }
              
            }

    或者

                var param = "哈哈";
                WaitHandle[] waitHandles = new WaitHandle[]
            {
                    new AutoResetEvent(false),
                    new AutoResetEvent(false),
                    new AutoResetEvent(false)
            };
    
                ThreadPool.QueueUserWorkItem((o) =>
                {
                    DTTEST(param);
                    ((AutoResetEvent)o).Set();
                }, waitHandles[0]);
                ThreadPool.QueueUserWorkItem((o) =>
                {
                    DTTEST(param);
                    ((AutoResetEvent)o).Set();
                }, waitHandles[1]);
                ThreadPool.QueueUserWorkItem((o) =>
                {
                    DTTEST(param);
                    ((AutoResetEvent)o).Set();
                }, waitHandles[2]);
                WaitHandle.WaitAll(waitHandles);
    
    
     static private void DTTEST(string a)
            {
                try
                {
                    Console.WriteLine(a);
                }
                catch (Exception ex)
                {
    
                    Console.WriteLine(ex);
                }
            }

    4、通过任务开启线程

    4.1通过Task

                 Task wt1 = Task.Run(() =>
                {
                    DTTEST();
                });
                Task wt2 = Task.Run(() =>
                {
                    DTTEST();
                });
                Task wt3 = Task.Run(() =>
                {
                    DTTEST();
                });
                var wtasks = new Task[] { wt1, wt2, wt3 };
                Task.WaitAll(wtasks);
    
             static private void DTTEST()
            {
    
                Console.WriteLine($"测试并行调用{DateTime.Now}");
            }

    4.2 Task.Factory.StartNew

                int val = 5;
    
                Task.Factory.StartNew(() =>
                {
                    MessageBox.Show("测试StartNew:无参数");
                });
    
                Task.Factory.StartNew(a =>
                {
                    MessageBox.Show("测试StartNew:参数值" + (int)a);
                }, val);

    5、Invoke实现

                      Parallel.Invoke(
                      () =>
                      {
                          DTTEST();
                      },
                       () =>
                       {
                           DTTEST();
                       },
                      () =>
                      {
                          DTTEST();
                      },
                      () =>
                      {
                          DTTEST();
                      },
                      () =>
                      {
                          DTTEST();
                      }
               );

     参考

  • 相关阅读:
    Beta阶段团队项目开发篇章2
    Beta阶段团队项目开发篇章1
    Alpha阶段博客链接
    大学生对技术网站需求的调查问卷结果分析
    关于大学生对技术网站需求的问卷调查
    第十。。。三周嘞
    进入第十一周喽
    第十周了耶~
    第九周也要过去啦~~~
    第,八,周,啦
  • 原文地址:https://www.cnblogs.com/macT/p/9916425.html
Copyright © 2020-2023  润新知