AutoResetEventとManualResetEventのC#のありふれました
A:終了状態と非国家終了
私はスレッドの終了および非終了状態の状態についてお話しましょう。AutoResetEventコンストラクタとManualResetEvent、スレッドの終了状態と終了状態を示すブール値変数があります。これは、非最終状態のための偽の真の終了を表します。コード片1を見てください:
代码片段1:
AutoResetEvent _autoResetEvent = new AutoResetEvent(false);
プライベート無効BT_Temp_Click(オブジェクト送信者、RoutedEventArgs e)は
{
スレッドT1 =新しいスレッド(this.Thread1Foo)。
t1.Start();
Thread.sleep(3000);
_autoResetEvent.Set()。
}
Thread1Fooボイド()
{
_autoResetEvent.WaitOne();
MessageBox.Show( "T1を終了");
}
このコードの実行結果は、3秒後に、ポップアップ"T1の終わり"です。
そして場合:
AutoResetEvent _autoResetEvent =新しい新しいAutoResetEvent(偽);
読み:
(真の)AutoResetEvent _autoResetEvent =新しい新しいAutoResetEvent;
"t1の終わりには、"すぐにポップアップ表示されます。
言い換えれば、終了状態、_autoResetEvent.WaitOne()は、スレッドの仕事を遮断する役割を果たしています。(PS:またManualResetEvent)
2:AutoResetEventとManualResetEventの違い
次に、AutoResetEventとManualResetEventとの違いを見てください。私たちは、コード・セグメント2とセグメント3のコードを見てみましょう。
代码段2:
AutoResetEvent _autoResetEvent =新しいAutoResetEvent(偽);
プライベート無効BT_Temp_Click(オブジェクト送信者、RoutedEventArgs e)は
{
スレッドT1 =新しいスレッド(this.Thread1Foo)。
t1.Start();
スレッドT2 =新しいスレッド(this.Thread2Foo)。
t2.Start();
Thread.sleep(3000);
_autoResetEvent.Set()。
}
ボイドThread1Foo()
{
_autoResetEvent.WaitOne()。
MessageBox.Show( "T1の終わり")。
}
Thread2Fooボイド()
{
_autoResetEvent.WaitOne();
MessageBox.Show(「T2を終了」);
}
このコードは、3秒かけて、実行される効果を、またはポップアップを「T1の終了」、またはポップアップを「T2の終了」ではなく両方がポップアップ表示されます。言い換えれば、の1が終了し、他のプロセスが終了することはありません。
スニペット3:
ManualResetEvent _menuRestEvent(falseに)=新しい新しいManualResetEvent。
プライベート無効BT_Temp_Click(オブジェクト送信者、RoutedEventArgs e)は
{
スレッドT1 =新しいスレッド(this.Thread1Foo)。
t1.Start();
スレッドT2 =新しいスレッド(this.Thread2Foo)。
t2.Start();
Thread.sleep(3000);
_menuRestEvent.Set()。
}
ボイドThread1Foo()
{
_menuRestEvent.WaitOne()。
MessageBox.Show( "T1の終わり")。
}
Thread2Fooボイド()
{
_menuRestEvent.WaitOne();
MessageBox.Show( "T2を終了");
}
効果このコードが実行され、3秒を超える、 "T1の終了"と"T2の終わり"は、2つのポップアップあります。言い換えれば、2つのプロセスが終わりました。
この機能は、AutoResetEventは、スレッドにシグナルを送信する、ということを意味し、複数のスレッドがシグナルを送信しません。我々は複数のスレッドを同期する必要がある場合は、あなただけのManualResetEventを使用することができます。根深い理由AutoResetEventがセット()の後に、スレッドの状態を自動的にfalseに設定され、セットでManualResetEventが()、スレッドの状態が真となり、その後、手動で(リセットする必要があります)、再される、ということであるのでスレッドがfalseに設定されています。これが理由でオート、マニュアルなどの理由自分の名前です。より完全にこのManualResetEvent特性を確認するために、我々は、コード片4を見て
スニペット4:
ManualResetEvent _menuRestEvent(偽の)=新しい新しいManualResetEvent。
プライベート無効BT_Temp_Click(オブジェクト送信者、RoutedEventArgs e)は
{
スレッドT1 =新しいスレッド(this.Thread1Foo)。
t1.Start();
スレッドT2 =新しいスレッド(this.Thread2Foo)。
t2.Start();
Thread.sleep(3000);
_menuRestEvent.Set()。
// _ menuRestEvent.Reset();
}
Thread1Fooのボイド()
{
_menuRestEvent.WaitOne();
MessageBox.Show( "T1ステップ1終了");
//睡眠1S、メインスレッド_menuRestEvent.Reset(待つ);
のThread.sleep(1000);
_menuRestEvent.WaitOne( );
MessageBox.Show( "T1ステップ2エンド");
}
Thread2Fooのボイド()
{
_menuRestEvent.WaitOne();
MessageBox.Show( "T2ステップ1終了");
//睡眠1S、メインスレッド_menuRestEvent.Reset(待つ);
のThread.sleep(1000);
_menuRestEvent.WaitOne( );
MessageBox.Show( "T2ステップ2エンド");
}
4のコードフラグメント、我々 // _ menuRestEvent.Reset()すなわち、_menuRestEvent.Set(後)、コメントされ、スレッドの状態は、真の状態であります、ランニングの結果は、 "T1のSTEP1終了"、 "T1のある STEP2終了"、 "T1のSTEP2の終わり"、 "T2のSTEP2の終わり" 3秒後にすべてのポップ。
そして、我々 // _ menuRestEvent.Reset()コメントを削除した場合、あなたは「T1のSTEP2エンド」と「T2のSTEP2の終わり」を見つけるだろうポップすることはありません。我々は再びメインスレッドで()を設定すること_menuRestEventない限り。
ます。https://www.cnblogs.com/zhangchenliang/archive/2012/07/26/2610384.htmlで再現