ホームページ  >  記事  >  バックエンド開発  >  C# での AutoResetEvent を使用した同期の詳細な説明と例

C# での AutoResetEvent を使用した同期の詳細な説明と例

黄舟
黄舟オリジナル
2017-03-28 11:10:421685ブラウズ

この記事では主に C# AutoResetEvent を使用して同期を実現するための関連情報を紹介します。興味のある方は参考にしてください。

数日前にスレッドの逐次実行で問題が発生しました。 . 、つまり、非同期スレッドがデータ要求を A インターフェイスに送信します。別の非同期スレッドは、A と B の両方が正常に実行されると、B インターフェイスにデータ要求を送信します。正直に言うと、私は BS プロジェクトに取り組んできましたが、スレッドについてはあまり知りません。 AutoResetEvent がスレッドに関連しており、スレッドの切り替えを処理するために使用されることは知っていたので、AutoResetEvent を使用して上記の問題に対処することにしました。


そこで、オンラインで関連情報を検索しました:


AutoResetEvent は .Net マルチスレッド プログラミングでよく使用されることがわかりました。スレッドが WaitOne メソッドを呼び出すと、シグナルは送信状態になり、スレッドはシグナルを取得し、プログラムは実行を続行します。それ以外の場合は待機します。さらに、AutoResetEvent.WaitOne() は一度に 1 つのスレッドのみを許可します。スレッドがシグナルを受け取ると、AutoResetEvent はシグナルを自動的に非送信状態に設定します。つまり、WaitOne を呼び出す他のスレッドは待機し続けることができます。 、AutoResetEvent は、1 つのスレッドがウェイクアップされたときにのみ、他のスレッドがブロックされたままになります。


はじめに

AutoResetEvent(boolInitialState):

Constructorは、初期状態を終了に設定するかどうかを示すブール値でこのクラスの新しいインスタンスを初期化します。 False: シグナルなし、サブスレッドの WaitOne メソッドは自動的に呼び出されません
true: シグナルがあります、サブスレッドの WaitOne メソッドが自動的に呼び出されます
Reset (): イベント ステータスを a に設定します終了していない状態。スレッドがブロックされます。操作が成功した場合は true が返され、それ以外の場合は false が返されます。
Set (): イベント ステータスを終了ステータスに設定し、1 つ以上の待機中のスレッドを続行できるようにします。操作が成功した場合は true を返し、それ以外の場合は false を返します。
WaitOne(): シグナルが受信されるまで現在のスレッドをブロックします。
WaitOne(TimeSpan, Boolean): 現在のインスタンスがシグナルを受信するまで現在のスレッドをブロックし、TimeSpan を使用して時間間隔を測定し、待機する前に同期ドメインを終了するかどうかを指定します。
WaitAll(): すべてのシグナルを待ちます。

実装

 class Program
 {

  static void Main()
  {
   Request req = new Request();

   //这个人去干三件大事 
   Thread GetCarThread = new Thread(new ThreadStart(req.InterfaceA));
   GetCarThread.Start();

   Thread GetHouseThead = new Thread(new ThreadStart(req.InterfaceB));
   GetHouseThead.Start();

   //等待三件事都干成的喜讯通知信息 
   AutoResetEvent.WaitAll(req.autoEvents);

   //这个人就开心了。 
   req.InterfaceC();

   System.Console.ReadKey();
  }
 }

 public class Request
 {
  //建立事件数组 
  public AutoResetEvent[] autoEvents = null;

  public Request()
  {
   autoEvents = new AutoResetEvent[]
   {
    new AutoResetEvent(false),
    new AutoResetEvent(false)
   };
  }

  public void InterfaceA()
  {
   System.Console.WriteLine("请求A接口");

   Thread.Sleep(1000*2);

   autoEvents[0].Set();

   System.Console.WriteLine("A接口完成");
  }

  public void InterfaceB()
  {
   System.Console.WriteLine("请求B接口");

   Thread.Sleep(1000 * 1);

   autoEvents[1].Set();

   System.Console.WriteLine("B接口完成");
  }

  public void InterfaceC()
  {
   System.Console.WriteLine("两个接口都已经请求完,正在处理C");
  }
 }

WaitOne または WaitAll にタイムアウトを追加することが最善であることに注意してください。それ以外の場合、シグナルは受信されず、スレッドは常にブロックされます。


あとがき

これは上記のシーンを単純化したもので、主に先ほど述べたシーンの問題を解決するために使用されます。

上記は AutoResetEvent の使用法をまとめたものです。欠点についていくつかアドバイスをお願いします。

以上がC# での AutoResetEvent を使用した同期の詳細な説明と例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。