[tips]:マルチスレッドManualResetEvent

5240 ワード

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: