[tips]: 多线程 ManualResetEvent

WaitHandle用于实现对共享资源的独占访问,AutoResetEvent和ManualResetEvent都继承自它。 WaitHandle.WaitOne方法将阻塞当前线程,直到WaitHandle收到信号。但有时候,我们需要非阻塞的方式测试WaitHandle 状态。

public virtual bool WaitOne(int millisecondsTimeout)

可以指定等待的时间间隔。如果当前实例收到信号,则为true;否则为false。特别地,如果 millisecondsTimeout为零,则该方法不会进入阻塞状态。该方法会测试等待句柄的状态并立即返回。

ManualResetEvent mre=new ManualResetEvent(false)  //默认无信号

mre.set()可以让当前实例获得信号

现在我们先让程序每个10秒输出Hello world,可以这么写:

 

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using System.Threading;
   6:  
   7: namespace MultiThread
   8: {
   9:     public class Program
  10:     {
  11:         static ManualResetEvent mre = new ManualResetEvent(false);
  12:         static void Main()
  13:         {
  14:             Thread t = new Thread(new ThreadStart(Hello));
  15:             t.Start();
  16:             while (true)
  17:             {
  18:                 char a = Console.ReadKey().KeyChar;
  19:                 if (a.ToString().ToUpper() == "X")
  20:                 {
  21:                     mre.Set();
  22:                     t.Abort();
  23:                     t.Join();
  24:                     Console.WriteLine(t.Name + " stopped");
  25:                     break;
  26:                 }
  27:             }
  28:         }
  29:  
  30:         static void Hello()
  31:         {
  32:             while (true)
  33:             {
  34:                 if (mre.WaitOne(1 * 1000)) break;
  35:                 Console.WriteLine("Hello");
  36:             }
  37:         }
  38:     }
  39: }
  40:  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值