問題タブ [manualresetevent]

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.

0 投票する
0 に答える
718 参照

.net - BackgroundWorker と ManualResetEvent

タスク。

内部で 2 つの長時間関数を実行するメソッドが 1 つあります。

ここでオブジェクトのロックについて話しているわけではありません。これらの関数は独立しており、読み取り専用で使用される同じパラメーターのみを持ちます。

スレッド内で実行する関数が 1 つ必要です。

問題。

<another code, dont bother>i do の直後に実行されますSet()。大丈夫です。

しかし、bw_RunWorkerCompletedその後を実行します。これは、結果変数にnullがあることを意味しますが、スレッドの関数の結果を含めたいです。

コードを作り直す方法 -result= (Result)e.Result次の行の前に実行する必要がありWaitOne()ますか?

BackgroundWorkerおそらく私はスレッドを使用する必要がありますか?.NET 2.0 を使用しています。

0 投票する
2 に答える
18551 参照

c# - Set() の直後に Reset() が呼び出されると、ManualResetEvent.WaitOne() が返されない

メイン処理ジョブがフリーズしたかどうかを確認するために使用される「ウォッチドッグ」タイマーを含むプロダクション サービスに問題があります (これは、残念ながらテストで再現できない COM 相互運用の問題に関連しています)。

現在の仕組みは次のとおりです。

  • 処理中、メイン スレッドは をリセットしManualResetEvent、1 つのアイテムを処理し (これにはそれほど時間はかかりません)、イベントを設定します。その後、残りのアイテムの処理を続行します。
  • 5 分ごとに、ウォッチドッグがWaitOne(TimeSpan.FromMinutes(5))このイベントを呼び出します。結果が false の場合、サービスは再起動されます。
  • 通常の操作中に、処理に 5 分ほどかからない場合でも、このウォッチドッグによってサービスが再起動されることがあります。

複数のアイテムが処理を待っている場合Set()、最初のアイテムが処理されてReset()から 2 番目のアイテムが処理されるまでの時間が短すぎWaitOne()て、イベントが設定されていることを認識していないように見えることが原因であると思われます。

私の理解でWaitOne()は、ブロックされたスレッドはが呼び出されたときにシグナルを受信することが保証されていSet()ますが、何か重要なものが欠けていると思います。

Thread.Sleep(0)を呼び出した後に呼び出してコンテキストの切り替えを許可するとSet()WaitOne()決して失敗しないことに注意してください。

以下に含まれているのは、私の製品コードと同じ動作を生成するサンプルです。が800 ミリ秒ごとに呼び出されているにもかかわらずWaitOne()、5 秒間待機して失敗することがあります。Set()

上記のコードの出力


質問

Set()密接に続いて呼び出すことReset()は、ブロックされたすべてのスレッドが再開されることを保証しないことを理解していますが、待機中のスレッドが解放されることも保証されません?

0 投票する
3 に答える
21251 参照

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

ManualResetEventの使用法に精通していませんか?

スレッド関連ですか。それは何をし、いつ使用されますか?

ここで、ManualResetEventが使用されているコードを取得しましたが、それが何をするのか理解できませんか?

これがコードです

の意味は何ですか_complete.WaitOne(); & _complete.Set(); ?

ManualResetEventクラスの使用法がある小さなサンプルコードを誰かに教えてもらえますか?

ManualResetEventの適切な議論と使用法をお探しですか?ありがとう

0 投票する
1 に答える
5527 参照

c# - BackgroundWorker c# で一時停止と再開機能を実装する方法

BackgroundWorker で一時停止再開とキャンセル機能を実装したいと考えています。私は1つのユーザーコントロールと、ユーザーコントロールに記述されたすべてのバックグラウンドワーカー関連のコードを持っています。ユーザーがボタンをクリックするたびに、フローレイアウトコントロールにユーザーコントロールを追加するだけです。私はManualResetEventで 一時停止と再開機能実装できませんでしたが、とにかく私はそれを行うことができません. ここに、ユーザー コントロール クラス関連のコードとフォーム コードを貼り付けます。

ここに、mu UI の外観の写真を添付し​​ます。 ここに画像の説明を入力

0 投票する
1 に答える
109 参照

winapi - この同期が機能しないのはなぜですか?

私はこのコードを持っています:

2 つの関数 (GenerateNumbersDisplayNumbers) を交互に呼び出したい。ただし、起動時にGenerateNumbersが 2 回呼び出された後、待機するだけです。DisplayNumbersメソッドが呼び出されることはありません。誰かがこのデッドロックの原因を説明できますか?

0 投票する
2 に答える
1750 参照

asynchronous - SignalR を使用してクライアント側メソッドを同期的に呼び出す

SignalR には、値を返すクライアント メソッドを持つ機能がありません。そのため、これを可能にするヘルパー クラスを作成しようとしています。

だから、これは私がやろうとしていることです:

  1. サーバー側: クライアント メソッドを呼び出し、一意のリクエスト ID を提供するClient(clientId).GetValue(requestId)
  2. サーバー側: requestId を保存し、次を使用して応答を待ちますManualResetEvent
  3. クライアント側: インサイドvoid GetValue(Guid requestId)コール サーバー メソッドhubProxy.Invoke("GetValueFinished", requestId, 10)
  4. サーバー側: requestId で待機メソッドを検索 => 戻り値を設定 => シグナルを設定
  5. サーバー側: メソッドは vor を待機しなくなりManualResetEvent、取得した値を返します。

残念ながら動作させることができます。これが私のコードです:

このMethodHandlerクラスを使用して、サーバー側に 2 つのメソッドが必要です。

クライアント側の実装は次のようになります。

問題:
サーバー側を呼び出す場合GetValue("clientid")。クライアント メソッドは呼び出されません。コメントアウトするreturnWaiter.Signal.WaitOne();と、クライアント側GetValueが呼び出され、サーバー側GetValueResultが呼び出されます。しかしもちろん、今回はメソッドはすでに返されています。

に関係していると思いましたManualResetEventが、使用してもwhile(!returnWaiter.HasValue) Thread.Sleep(100);この問題は解決しません。

この問題を解決する方法はありますか?

前もって感謝します!

0 投票する
2 に答える
492 参照

.net - .NET - ManualResetEvent.Reset スレッドのブロック

MSDN によると、ManualResetEventReset()メソッドの目的は -

イベントの状態を非シグナル状態に設定し、スレッドをブロックさせます。

それはどのスレッドをブロックしますか? 呼び出しスレッドまたは現在のスレッドまたはその他のスレッド?

前もって感謝します。