13

ManualResetEventの使用法に精通していませんか?

スレッド関連ですか。それは何をし、いつ使用されますか?

ここで、ManualResetEventが使用されているコードを取得しましたが、それが何をするのか理解できませんか?

これがコードです

public class Doc : SomeInterfaceFromTheDll
{
  private readonly IVersion version; // An interface from the DLL.
  private readonly ManualResetEvent _complete = new ManualResetEvent(false);

  private bool downloadSuccessful;

  // ...

  public bool Download()
  {
    this.version.DownloadFile(this);
    // Wait for the event to be signalled...
    _complete.WaitOne();
    return this.downloadSuccessful;
  }

  public void Completed(short reason)
  {
    Trace.WriteLine(string.Format("Notify.Completed({0})", reason));
    this.downloadSuccessful = reason == 0;
    // Signal that the download is complete
    _complete.Set();
  }

  // ...
} 

の意味は何ですか_complete.WaitOne(); & _complete.Set(); ?

ManualResetEventクラスの使用法がある小さなサンプルコードを誰かに教えてもらえますか?

ManualResetEventの適切な議論と使用法をお探しですか?ありがとう

4

3 に答える 3

17

このクラスの使用法についてかなり明確になっているMSDNページのManualResetEvent「備考」セクションを読むことをお勧めします。

特定の質問に答えるために、は非同期の場合でもManualResetEventへの同期呼び出しをシミュレートするために使用されます。asyncメソッドを呼び出し、が通知Downloadされるまでブロックします。ManualResetEventManualResetEvent、非同期イベントベースのパターンのイベントハンドラー内で通知されます。したがって、基本的には、イベントが発生してイベントハンドラーが実行されるまで待機します。

于 2013-03-27T10:23:16.283 に答える
5

どんな主題でも深く理解するためには、言い換えればほとんど同じ情報を読まなければなりません。ManualResetEventに関するMSDNドキュメントを読みましたが、ほとんど理解できて良かったのですが、このリンクはそれをよく理解するのに役立ちました。

http://dotnetpattern.com/threading-manualresetevent


非常に簡単な説明

現在のスレッドがWiatOne()メソッドを呼び出す場合、他のスレッドがSet()メソッドを呼び出すまで待機します(したがって、何もしないでください)。

WaitOneにはもう1つのオーバーロードがあり、WaitOne(TimeSpan)です。これは上記とほぼ同じですが、たとえばこのメソッドに5秒の時間を与えると、現在のスレッドは他のスレッドがSet()メソッドを呼び出すのを5秒間待機し 、誰もSet()を呼び出さない場合はそれを自動的に呼び出し、作業を調整します。

于 2017-02-22T08:45:46.213 に答える
3

ManualSetEventは、あるスレッドを停止して別のスレッド(スレッド)が終了するのを待つ必要がある場合に、異なるスレッド間の通信を管理するのに役立つクラスです。その場合、そのクラスは非常に便利です。

于 2015-02-04T14:06:37.433 に答える