この記事では主に C# AutoResetEvent を使用して同期を実現するための関連情報を紹介します。興味のある方は参考にしてください。
数日前にスレッドの逐次実行で問題が発生しました。 . 、つまり、非同期スレッドがデータ要求を A インターフェイスに送信します。別の非同期スレッドは、A と B の両方が正常に実行されると、B インターフェイスにデータ要求を送信します。正直に言うと、私は BS プロジェクトに取り組んできましたが、スレッドについてはあまり知りません。 AutoResetEvent がスレッドに関連しており、スレッドの切り替えを処理するために使用されることは知っていたので、AutoResetEvent を使用して上記の問題に対処することにしました。はじめに
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 サイトの他の関連記事を参照してください。