web-dev-qa-db-ja.com

ManualResetEventの使用法c#の使用について?

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の適切な議論と使用法をお探しですか?ありがとう

11
Thomas

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

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

17
ken2k

あらゆる主題を深く理解するためには、ほぼ同じ情報を読む必要があります。 ManualResetEventに関するMSDNドキュメントを読みましたが、ほとんど理解できて良かったのですが、このリンクはそれをよく理解するのに役立ちました。

http://dotnetpattern.com/threading-manualresetevent


非常に簡単な説明

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

WaitOneには別の過負荷があります。 WaitOne(TimeSpan)。これは上記とほぼ同じですが、例として 5秒 このメソッドまでの時間、現在のスレッドは他のスレッドが呼び出すのを待っています セットする() のための方法 5秒 誰も呼ばなかったら セットする()、それは自動的にそれを呼び出し、作業を調整します。

4
koviroli

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