問題タブ [waithandle]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - どのロック プリミティブを使用するか?
昨日、使用している単純なキャッシュ オブジェクトにマルチスレッドの問題があることを発見しました。
この問題は、asp.net Web サイトで発見されました。エラーメッセージは、「既に存在するハッシュテーブルに値を追加しようとしています。上記のコードからわかるように、これが発生する可能性は間違いなく終了します。私はウェイトハンドルにある程度精通しており、それらが問題を解決すると考えていました。 .だから私はクラスレベルで私のwaithandleを宣言しました:
次に、問題のあるコードの特定のセクションで:
何らかの理由で、上記の次のコードは常にブロックされていました。最初のスレッドでさえ、コードにアクセスしました。私はしばらく物事をいじり、コンストラクターで待機ハンドルをシグナル状態に設定しようとしましたが、それを機能させることはできませんでした。
私は代わりに次のものを使用することになりますが、これは正常に機能します。
だから私は2つの質問があります:
- waithandle ソリューションが機能しなかったのはなぜですか?
- SynLock は、この場合に使用する正しい/最適化されたロック タイプですか?
c# - 制限時間内にプロセスを強制終了するロジック
ここで私の論理が正しいことを確認したいと思います。プロセスを数秒間実行したいのですがtimeout、それが長く実行されている場合は、すぐに強制終了する必要があります。
フラグはcompleted、プロセスが意図したとおりに完了したかどうかを確実に示す必要があります。
process.HasExitedまた、へのチェックが正しいかどうか、私は確信が持てません。process.WaitForExit()false を返し、Kill()成功した場合、process.HasExited 常にtrue になりますか? それは私の推測ですが、確認したかったのです。また、ログ記録以外に、Kill() が失敗した場合に何かできることがあるとしたら?
c# - 待機ハンドルの使用
私はこのようなことをしようとしています:
コードの他の場所には、以下を呼び出すメソッドがあります。
したがって、LongRunningOperation() が実行されます。
問題は、スレッドの実行handler.Set()中に が再度呼び出される可能性があることです。AsyncWait()LongRunningOperation()
これにより、がまだ実行されている間に が呼び出さLongRunningOperation()れるたびに、 が呼び出されることはありません。handler.Set()AsyncWait()LongRunningOperation()
これを正しくする方法は?:(
c# - メインスレッドによって生成されたバックグラウンドスレッドからイベントが発生するのを待っています
最初にイベントから起動されたスレッドで一部のデータを処理している状況がありますが、続行する前にメインスレッドで何かが発生するまで待機する必要があります-問題は、これらが同時に実行される可能性があることです。実際の基本的な例:
イベント トリガー -> 独自のスレッドでバックグラウンドで実行するように設定されたメソッド -> メイン スレッドのデータ送信メソッドを使用してデータを送信 -> そのデータの受信に対する ACK を待機 -> メイン スレッドで WaitHandle を設定 -> ワーカー スレッド次に、次のデータ セットを送信します -> 繰り返します -> すべてのデータが送信されて ACK が返されたら、スレッドを終了します。
現在、ACK が着信するたびに設定される AutoResetEvent が 1 つあります。実行中のワーカー スレッドはそれをリッスンしますが、一度に 10 個のワーカー スレッドが実行されていて、それらがすべてリッスンしている場合それは目的を無効にします。
ワーカー スレッドを生成し、特定の WaitHandle が設定/リセットされるのをリッスン (WaitOne) させ、それに基づいて続行する必要があります。
このようなことを達成するための最良の方法は何でしょうか? どういうわけか、WaitHandles の配列を作成し、ワーカー スレッドにそのインデックスの AutoResetEvent をリッスンさせますか?
c# - AutoResetEvent.WaitOne とタイムアウトと Thread.Sleep の比較
任意の一時停止を実行するソリューションが必要です。遅延精度は関係ありません。このようなシナリオでのWaitHandle.WaitOne Method (TimeSpan)とThread.Sleep Methodの実際的な違いは何ですか。より良い解決策はありますか?
c# - 基本的なスレッド同期のために WaitHandle を破棄する
ドキュメントによると、.NET の WaitHandle は明示的/暗黙的に破棄する必要があります。ただし、次の基本的な同期タスクでこれを達成するのに問題があります。
- 時間のかかるタスクがスレッドで実行されています。
- メイン スレッドは、事前に定義された期間、タスクが完了するのを待ちます。次の場合、メイン スレッドを続行する必要があります。タスクが完了する、または b. タイムアウトが発生しました。
ここで AutoResetEvent オブジェクトを使用しようとしています:
メイン スレッドの待機がタイムアウトし、待機ハンドル オブジェクトが破棄されて ObjectDisposedException 例外が発生するという明らかな競合状態があります。ハンドルが適切に破棄され、例外が発生しないように、これを設定する他の方法はありますか?
.net - WaitHandle.WaitAny が小さいインデックスを持つハンドルを優先しないようにする方法は?
WaitAny()ドキュメントは言う:
呼び出し中に複数のオブジェクトがシグナル状態になった場合、戻り値は、すべてのシグナル状態のオブジェクトの中で最小のインデックス値を持つシグナル状態のオブジェクトの配列インデックスです。
つまり、ハンドルを「公平に」処理しません。つまり、最も長い時間信号を送信するものを選択するか (希望的観測だと思います)、少なくともランダムに信号を送信されたものを選択するだけで、時間の経過とともに公平性が少なくとも統計的に提供されます。
WaitAny()もちろん、すべての呼び出しで待機ハンドルのリスト (ラウンドロビンまたはランダム) の異なる順列を提供できます。
しかし、これを行うためのよりスマートな方法はありませんか?
(元々はメソッドが公平かどうかをチェックしていたのですが、BlockingCollection.TryTakeFromAny()に基づいてWaitHandle.WaitAnyいるため、公平でもありません。)
c# - WaitAny() での WaitHandles の配列の使用
プログラムは、待機可能なタイマーを設定します。その部分はうまく機能します。タイマーがトリガーされるまで、スレッドはブロックされています。私がやりたいことは、WaitHandles の 1 つで .Set を呼び出して、スレッドをブロックから解放できるようにすることです。このコードの .Set の書き方は利用できないようですので、今のところその行をコメントアウトしました。スレッドのブロックを解除するには、タイマーの 1 つを呼び出す必要があります。誰もこれを行う方法を知っていますか?
私が今抱えている問題は、 set への呼び出しが次のように終わることです:
エラー 1 'System.Threading.WaitHandle' には 'Set' の定義が含まれておらず、タイプ 'System.Threading.WaitHandle' の最初の引数を受け入れる拡張メソッド 'Set' が見つかりませんでした (using ディレクティブまたはアセンブリ参照?) C:\Users\Eric\Documents\Visual Studio 2013\Projects\waitany\ConsoleApplication1\Program.cs 86 38 ConsoleApplication1