[tips]:マルチスレッドManualResetEvent
5240 ワード
WaitHandleは、共有リソースへの独占アクセスを実現するために使用され、AutoResetEventとManualResetEventが継承されます.WaitHandle.WaitOneメソッドは、WaitHandleが信号を受信するまで、現在のスレッドをブロックします.しかし、WaitHandle状態を非ブロックでテストする必要がある場合があります.
待機時間間隔を指定できます.現在のインスタンスが信号を受信した場合、trueとなります.そうでなければfalseです.特に、millisecondstimeoutがゼロの場合、この方法はブロック状態に入ることはない.このメソッドは、待機ハンドルのステータスをテストし、すぐに戻ります.
ManualResetEvent mre=new ManualResetEvent(false)/デフォルト信号なし
mre.set()は、現在のインスタンスに信号を取得させることができる
まずプログラムに10秒ごとにHello worldを出力させます.
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: