気になった事を自由に書いてます。
      
AutoResetEventを調べてみた。
スレッド処理の中に良く見かけるAutoResetEvent・・・
シグナル、非シグナル?なんだそれ?というレベルの人が調べてみました。

AutoResetEventはスレッドと同期をとりながら処理するときに使用します。
このオブジェクトは「シグナル状態」と「非シグナル状態」の2つの状態を持ちます。
シグナルというのはスレッドの処理を中断/再開させるオブジェクトです。
このオブジェクトの状態がシグナルのときは処理を中断させませんが、
非シグナルのときは処理を中断させます。処理を再開させたい場合は
オブジェクトの状態をシグナルにします。
同期イベントにはAutoResetEventとManualResetEventの2種類あります。

AutoResetEvent AutoResetEventは1つのスレッドの中断を再開させると自動で「シグナル状態」→
「非シグナル状態」にします。そのため、他のスレッドは中断状態のままです。
上の例でいくとスレッド4は処理を再開するが、スレッド1~3は中断状態のままです。

テストコード
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

static private AutoResetEvent _autoEvent;

private void Form1_Load(object sender, EventArgs e)
{
    _autoEvent = new AutoResetEvent(false);
}
public Form1()
{
    InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
    Console.WriteLine("スレッドを開始します...");
    Thread t = new Thread(DoWork);
    t.Start();
}

private void button2_Click(object sender, EventArgs e)
{
    Console.WriteLine("シグナル状態にしました...");
    _autoEvent.Set();
}

private void DoWork()
{
    Console.WriteLine("  シグナル状態になるのを待ちます...[Thread:" + Thread.CurrentThread.ManagedThreadId + "]");
    _autoEvent.WaitOne();
    Console.WriteLine("  シグナル状態になりました...      [Thread:" + Thread.CurrentThread.ManagedThreadId + "]");
}

      






Copyright (C) 2011 - 2017 猫の気ままなC#日記