zoukankan      html  css  js  c++  java
  • C# 多线程的等待所有线程结束的一个问题

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    using System;
    using System.Threading;
     
    namespace ConsoleApplication1
    {
        class Program
        {
            private static AutoResetEvent[] events;
     
            static void Main(string[] args)
            {
                int threadNum = 10;
                Thread[] thread = new Thread[threadNum];
     
                events = new AutoResetEvent[threadNum];
     
                for (int i = 0; i < threadNum; i++)
                {
                    var waithandler = new AutoResetEvent(false);
                    events[i] = waithandler;
                    ThreadStart starter = delegate
                    {
                        var param = new Tuple<string, AutoResetEvent>("test print:" + i, waithandler);
                        Print(param);
                    };
                    thread[i] = new Thread(starter)
                    {
                        Name = "thread" + i.ToString()
                    };
                }
     
                for (int i = 0; i < threadNum; i++)
                {
                    thread[i].Start();
                }
     
                WaitHandle.WaitAll(events);
                Console.WriteLine("Completed!");
                Console.Read();
     
            }
     
            private static void Print(object param)
            {
                var p = (Tuple<string, AutoResetEvent>)param;
                Console.WriteLine(Thread.CurrentThread.Name + ": Begin!");
                Console.WriteLine(Thread.CurrentThread.Name + ": Print" + p.Item1);
                Thread.Sleep(300);
                Console.WriteLine(Thread.CurrentThread.Name + ": End!");
                p.Item2.Set();
            }
        }
    }

    一次性地Set,其实使用ManualResetEvent就足够了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    using System;
    using System.Collections.Generic;
    using System.Threading;
     
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                var waits = new List<EventWaitHandle>();
                for (int i = 0; i < 10; i++)
                {
                    var handler = new ManualResetEvent(false);
                    waits.Add(handler);
                    new Thread(new ParameterizedThreadStart(Print))
                    {
                        Name = "thread" + i.ToString()
                    }.Start(new Tuple<string, EventWaitHandle>("test print:" + i, handler));
                }
                WaitHandle.WaitAll(waits.ToArray());
                Console.WriteLine("Completed!");
                Console.Read();
     
            }
     
            private static void Print(object param)
            {
                var p = (Tuple<string, EventWaitHandle>)param;
                Console.WriteLine(Thread.CurrentThread.Name + ": Begin!");
                Console.WriteLine(Thread.CurrentThread.Name + ": Print" + p.Item1);
                Thread.Sleep(300);
                Console.WriteLine(Thread.CurrentThread.Name + ": End!");
                p.Item2.Set();
            }
     
        }
    }






  • 相关阅读:
    class(类)和构造函数(原型对象)
    es6中export和export default的区别
    vue混入 (mixin)的使用
    ES6(Module模块化)
    vue-cli3构建和发布 实现分环境打包步骤(给不同的环境配置相对应的打包命令)
    Vue中使用Echarts 脱坑
    Nginx配置详解
    VUE面包屑组件
    更改 pip 默认下载源(pip 配置文件)
    常见免费API接口
  • 原文地址:https://www.cnblogs.com/yzpopulation/p/4919080.html
Copyright © 2011-2022 走看看