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();
            }
     
        }
    }






  • 相关阅读:
    阿里IM技术分享(六):闲鱼亿级IM消息系统的离线推送到达率优化
    IM开发基础知识补课(十):大型IM系统有多难?万字长文,搞懂异地多活!
    长连接网关技术专题(六):石墨文档单机50万WebSocket长连接架构实践
    手把手教你实现网页端社交应用中的@人功能:技术原理、代码示例等
    跟着源码学IM(九):基于Netty实现一套分布式IM系统
    网络编程懒人入门(十三):一泡尿的时间,快速搞懂TCP和UDP的区别
    探探的IM长连接技术实践:技术选型、架构设计、性能优化
    直播系统聊天技术(六):百万人在线的直播间实时聊天消息分发技术实践
    基于实践:一套百万消息量小规模IM系统技术要点总结
    Datafram 实现作为正文发送邮件
  • 原文地址:https://www.cnblogs.com/yzpopulation/p/4919080.html
Copyright © 2011-2022 走看看