問題タブ [autoresetevent]
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.
c# - AutoResetEventが正しくブロックされない
可変数のワーカースレッドを作成し、それらの間でタスクを分散するスレッドがあります。これは、以下に実装を示すTaskQueueオブジェクトをスレッドに渡すことで解決されます。
これらのワーカースレッドは、与えられたTaskQueueオブジェクトを繰り返し処理し、各タスクを実行します。
ご覧のとおり、AutoResetEventオブジェクトを使用して、ワーカースレッドが途中で終了しないようにしています。つまり、タスクを取得する前です。
一言で言えば:
- メインスレッドは、タスクをそのTaskQueueにEnqeueueすることによってスレッドにタスクを割り当てます
- メインスレッドは、TaskQueueのFinish()メソッドを呼び出すことにより、実行するタスクがなくなったことをスレッドに通知します。
- ワーカースレッドは、TaskQueueのDequeue()メソッドを呼び出して、割り当てられた次のタスクを取得します
問題は、Dequeue()メソッドがInvalidOperationExceptionをスローし、キューが空であることを示していることです。ご覧のとおり、ログを追加しましたが、 Set()メソッドの呼び出しがなかったとしても、 AutoResetEventはDequeue ()をブロックしないことがわかりました。
私が理解しているように、AutoResetEvent.Set()を呼び出すと、待機中のスレッド(以前はAutoResetEvent.WaitOne()を呼び出していた)を続行でき、次にAutoResetEvent.Reset()を自動的に呼び出して、次のウェイターをブロックします。
では、何が間違っている可能性がありますか?私は何か間違ったことをしましたか?どこかにエラーがありますか?私は今この上に3時間座っていますが、何が悪いのか理解できません。私を助けてください!
どうもありがとうございます!
.net - AutoResetEventタイプはアトミックスイッチに適していますか?
複数のスレッドからの大量の受信データを処理しているとします。特定の基準が満たされたときに、このデータを特定のアクションのトリガーとして機能させたい場合があります。ただし、アクションは再入可能ではありません。したがって、同じトリガーを2回続けてすばやく起動すると、アクションは1回だけ実行されます。
bool
競合状態が発生し、2つ(またはそれ以上)のスレッドが結局同じアクションを同時に実行する可能性があるため、単純なフラグを使用してアクションが現在実行されているかどうかを示すことは、堅牢なソリューションではありません。もちろん、同期オブジェクトのステートメント内bool
は機能します。lock
しかし、私は通常、可能な限りロックを避けることを好みます*。
現在、これらの場合に私が行っているのはAutoResetEvent
、本質的にアトミックスイッチの形式として使用することです。通常、コードは次のようになります。
これは機能しますが、これはクラスの理想的なユースケースではない可能性があることに気づきましたAutoResetEvent
。これはこの問題の適切な解決策だと思いますか、それとも他のメカニズムを使用する方が理にかなっていますか?
更新:Jonが指摘したMonitor.TryEnter
ように、ロック戦略として使用することは(単純なものではなく、lock
ほぼ同等であると私は信じていますMonitor.Enter
)、非常に簡単です。
そうは言っても、私はヘンクの使用するという考えに強く賛成する傾向がありInterlocked
ます。それはそれが得るのと同じくらい簡単に思えます。
c# - 回避方法 安全ハンドルが閉まっている
テストに次のコードがあります。
次のテストを実行すると
LoadIncomeStatementViewModel() が 2 回目に呼び出されると、EventHandler handler = (sender, e) => evt.Set(); で「安全なハンドルが破棄されました」というエラー メッセージが表示されます。
メソッドが 2 回目に再実行されると、必ず using ステートメントによって evt が再初期化されます。これは、Resharper テスト ランナー (Nunit 2.7) と関係があるのではないかと感じています。
c# - 基本的に最初にリセットを呼び出す WaitOne メソッドはありますか?
イベントで複数の Set 呼び出しを行うことができる AutoResetEvent を使用しています (例外処理)。追加の Set が呼び出される場合があるため、コードが WaitOne イベントで 2 番目の呼び出しを行うと、ゲートが既に開かれているため、そのまま通過します。
解決策は、WaitOne の直前に Reset を呼び出すことです。よりクリーンなソリューションはありますか、それともこれが唯一の方法ですか? コード例:
例外が処理された後、DoSomeWork を再度呼び出す必要がありますが、Set は複数の例外 (または再スローされた例外) で呼び出された可能性があるため、WaitOne はそのまま流れます。
私の解決策は、常に WaitOne の前に Reset を呼び出すことです。これは適切な解決策ですか、設計が不十分ですか、それともこのシナリオを処理する別の種類のイベントがありますか?
編集:コメント付きのリセット(提案された解決策)をイベントの横に移動しました。
c# - AutoResetEventがその回数を設定しない場合にのみ待機するための最良の方法
AutoResetEventの適切な設計の範囲外になっている可能性がありますが、何を使用すればよいかよくわかりません。私はこの振る舞いが欲しい:
残念ながら(私の問題では)、これはAutoResetEventの動作ではありません。この状況で使用するのに最適なクラスは何ですか?
注:.NETParallelExensionsライブラリにアクセスできます。
c++ - BoostC++を使用した同期クラスのようなWin32リセットイベント
WaitForSingleObject()およびWaitForMultipleObjects()と同じセマンティクスを持つ関数を介してチェックできるWin32リセットイベントを彷彿とさせるメカニズムが必要です(現時点では..SingleObject()バージョンのみが必要です)。しかし、私は複数のプラットフォームをターゲットにしているので、私が持っているのはboost :: threads(AFAIK)だけです。私は次のクラスを思いついたので、潜在的な問題について、そしてそれがタスクに任されているかどうかについて質問したいと思いました。前もって感謝します。
使用例;
編集
MichaelBurrの提案に従ってコードを修正しました。私の「非常に単純な」テストは問題がないことを示しています。
.net - IObservable-AutoResetEventを置き換えます
以下のAutoResetEventをどのように置き換えることができるのか疑問に思っていますか?RXのやり方やタスクでそれを行う方法を考えようとしていましたが、それを行う方法を見ることができます。
multithreading - 現在実行されているコードがUIスレッドにあるかどうかを確認するにはどうすればよいですか?
私はSilverlightアプリケーションを開発していますが、UIスレッドで実行された場合に例外をスローするメソッドがあります。これは、UIスレッドがフリーズするタイムアウトなしでAutoResetEvent.WaitOne()を使用するためです。
現在のスレッドがUIスレッドであるかどうかを検出するにはどうすればよいですか?
編集:
このメソッドは、UIコンポーネントではなく、クラスライブラリに存在することに注意してください。
c# - AutoResetEvent リセット メソッド
誰かが AutoResetEvent.Reset() メソッドのユースケースを紹介できますか? いつ、なぜこの方法を使用したいのですか? WaitOne と Set は理解できますが、これは私にはよくわかりません。
c# - Using AutoResetEvent to signal worker thread
I have a service that is running constantly processing data, it receives requests to process new data through messaging. While it's busy processing new requests get merged together so that they are then all processed at once. An AutoResetEvent is used to notify the processor that a new request is available.
My question is in EventLoop should it be possible that currentRequest after the WaitOne to be null?
Is it bad practice to have the _eventAvailable.Set() outside of the lock(_eventLocker)? I moved it out so that it wouldn't start going at the WaitOne and immediately contest the lock(_eventLocker).
Any suggestions on how to better write the following code?