• C# 使用 AutoResetEvent 或 ManualResetEvent 同步两个线程


     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading;
     6 
     7 namespace ThreadTest
     8 {
     9     class Program
    10     {
    11         // 信号 
    12         static AutoResetEvent ar = new AutoResetEvent(false);
    13 
    14         // 一个公用的变量
    15         static int i = 0;
    16 
    17         // Thread Method 1
    18         static void WriteMethod(object state) {
    19             while (i < 10) {
    20                 Thread.Sleep(1000);
    21                 i++;
    22                 //Console.WriteLine("{1} Write i : {0}", i, Thread.CurrentThread.Name);
    23                 Console.WriteLine("{1} Write i : {0}", i, (string)state);
    24                 ar.Set();
    25             }
    26         }
    27 
    28         // Thread Method 2
    29         static void ReadMethod(object state) {
    30             while (true) {
    31                 ar.WaitOne();
    32                 //Console.WriteLine("{1} Read i : {0}", i, Thread.CurrentThread.Name);
    33                 Console.WriteLine("{1} Write i : {0}", i, (string)state);
    34             }
    35         }
    36 
    37         static void Main(string[] args) {
    38             // 开启 写入线程
    39             // 线程池方法
    40             ThreadPool.QueueUserWorkItem(WriteMethod,"Write Thread ");
    41 
    42             // 普通开线程方法
    43             //Thread write = new Thread(new ThreadStart(WriteMethod));
    44             //write.Name = "Write Thread ";
    45 
    46             // 如果是后台线程,需要 一个 Console.ReadKey 等待
    47             //write.IsBackground = true;
    48             //write.Start();
    49 
    50             // 开启 读取线程
    51             // 线程池方法
    52             ThreadPool.QueueUserWorkItem(ReadMethod,"Read Thread ");
    53 
    54             // 普通开线程方法
    55             //Thread read = new Thread(new ThreadStart(ReadMethod));
    56             //read.Name = "Read Thread ";
    57 
    58             // 如果是后台线程,需要 一个 Console.ReadKey 等待
    59             //read.IsBackground = true;
    60             //read.Start();
    61 
    62             // 如果使用线程池方法的时候.线程都是 后台线程. Console 会立即结束.所以需要这个方法来阻塞主线程
    63             Console.ReadKey();
    64         }
    65     }
    66 }
  • 相关阅读:
    腾讯X5内核使用详解(X5内核播放器使用如何去除控制栏全屏播放)以及一些注意事项
    易语言加壳SDK(宏标记)
    安卓相对布局常用语句
    安卓平分位置layout_weight学习记录
    为什么要前后端分离?各有什么优缺点?
    前端开发技术路线
    超实用的JQuery小技巧
    HTML元素脱离文档流的三种方法
    Promise的理解
    JS闭包是什么?
  • 原文地址:https://www.cnblogs.com/easyfrog/p/3141255.html
Copyright © 2020-2023  润新知