zoukankan      html  css  js  c++  java
  • 对ManualResetEvent和AutoResetEvent的巩固练习

          在多线程编程中,最常用到的就是线程同步问题,前段时间开发地址采集服务器,需要携带经纬度到MapAbc中采集后,返回地址,才可以进行下一条经纬度的采集,因为队列处理和解析不是同一个线程,并且是解析经纬度是异步的操作,所以就涉及到线程同步问题,所以针对这个对ManualResetEvent和AutoResetEvent两个信号量巩固练习一下。

     1 class Program
     2     {
     3         static ManualResetEvent _ManualResetEvent = new ManualResetEvent(false);
     4         static void Main(string[] args)
     5         {
     6             int i = 0;
     7             Thread _Thread = new Thread(TestFun);
     8             _Thread.Start();
     9 
    10             _ManualResetEvent.Set();
    11             //Thread.Sleep(100);
    12             Console.WriteLine("test1");
    13             Console.ReadLine();
    14         }
    15 
    16         static void TestFun()
    17         {
    18             while (true)
    19             {
    20                 _ManualResetEvent.WaitOne();
    21                 Console.WriteLine("test");
    22                 Thread.Sleep(100);
    23             }
    24         }
    25     }

    当是手动时,信号量为打开状态,会一直打印test

     1 class Program
     2     {
     3         static ManualResetEvent _ManualResetEvent = new ManualResetEvent(false);
     4         static void Main(string[] args)
     5         {
     6             int i = 0;
     7             Thread _Thread = new Thread(TestFun);
     8             _Thread.Start();
     9 
    10             _ManualResetEvent.Set();
    11             //Thread.Sleep(100);
    12             Console.WriteLine("test1");
    13             Console.ReadLine();
    14         }
    15 
    16         static void TestFun()
    17         {
    18             while (true)
    19             {
    20                 _ManualResetEvent.WaitOne();
    21                 Console.WriteLine("test");
    22                 Thread.Sleep(100);
    23                 _ManualResetEvent.Reset();
    24             }
    25         }
    26     }

    当把信号量重置后,就不会继续打印test了

    如果使用AutoResetEvent的话

     1  class Program
     2     {
     3         static AutoResetEvent _AutoResetEvent = new AutoResetEvent(false);
     4         static void Main(string[] args)
     5         {
     6             int i = 0;
     7             Thread _Thread = new Thread(TestFun);
     8             _Thread.Start();
     9 
    10             _AutoResetEvent.Set();
    11             //Thread.Sleep(100);
    12             Console.WriteLine("test1");
    13             Console.ReadLine();
    14         }
    15 
    16         static void TestFun()
    17         {
    18             while (true)
    19             {
    20                 _AutoResetEvent.WaitOne();
    21                 Console.WriteLine("test");
    22 
    23             }
    24         }
    25     }

    其实跟ManualResetEvent一个原理,只是Set之后,只执行一次,需要重新再Set,WaitOne处才会继续执行下去

  • 相关阅读:
    sharepoint tip (视图)
    how to use mstsclib
    Why I Love My Virtual PCs
    科普 | 什么是去中心化自治组织(DAO)
    毕业生的商业软件开发之路 C#基本语法C#代码模块逻辑框架
    文本编辑器中文字断行及排版算法研究
    [毕业生的商业软件开发之路]C#异常处理
    毕业生的商业软件开发之路关于企业培训
    开源C#2.0体温单程序
    论电子病历文本编辑器
  • 原文地址:https://www.cnblogs.com/djzny/p/4118569.html
Copyright © 2011-2022 走看看