問題タブ [waitone]
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
andを使用することでしたが、待機タイムアウトが終了した直後にWaitOne()
イベントが常にトリガーされました。そこで、以下のアプローチに戻りましたが、それでも同じ問題があります。タイムアウトが終了してから2〜3秒後に、タイムアウトが何であったかに関係なく、イベントがトリガーされます。
イベントハンドラコードは次のとおりです。
イベント自体は、上記の関数を呼び出す別の関数からトリガーされます。基本的には次のようになります。
誰かがこの問題の原因と私がそれを解決する方法を知っていますか?
編集:もう関係ありません。時間内に他の解決策が見つからなかったため、OnResponseArrivedイベントを転送しました。
c# - AutoResetEvent オブジェクトで WaitOne メソッドを呼び出したスレッドのブロックを解除するにはどうすればよいですか?
以下は、私の問題を示すメソッド「SomeMethod」を持つクラスです。
このメソッドはスレッドセーフになるように設計されており、異なるスレッドで呼び出されます。ここで私の質問は、いつでも「theEvent」オブジェクトで「WaitOne」メソッドを呼び出したすべてのスレッドのブロックを解除する方法です。マルチスレッド プログラムを正常に停止および開始できるようにする必要があるため、この要件は私の設計で頻繁に発生します。マルチスレッド プログラムを開始するのはかなり簡単ですが、停止するのは難しいように思えます。
これが私がこれまでに試したもので、明らかにうまくいきます。しかし、これは標準的なアプローチですか?
「UnblockAll」メソッドは、「SomeClass」クラスのメンバーです。ここで使用する手法は、WaitOne メソッドの MSDN ドキュメントに基づいています。以下のドキュメントの関連部分を引用しています。
millisecondsTimeout がゼロの場合、メソッドはブロックされません。待機ハンドルの状態をテストし、すぐに戻ります。
do..while ループでSet メソッドを呼び出します。これにより、WaitOne メソッド (「SomeMethod」メソッド内にコード化されている) への呼び出しが原因でブロックされた可能性がある単一のスレッドが解放されます。次に、'theEvent' オブジェクトの状態をテストして、シグナル状態かどうかを確認します。このテストは、タイムアウト パラメータを受け取る WaitOne メソッドのオーバーロードされたバージョンを呼び出すことによって行われます。WaitOne メソッドを呼び出すときに使用する引数はゼロです。ドキュメントによると、呼び出しはブール値ですぐに返されます。戻り値が true の場合、「theEvent」オブジェクトはシグナル状態です。「SomeMethod」メソッドの「WaitOne」メソッドの呼び出しで少なくとも 1 つのスレッドがブロックされていた場合、「Set」メソッド (「UnblockAll」メソッド内にコード化されている) の呼び出しによってブロックが解除されます。したがって、'UnblockAll' メソッドの do..while ステートメントの最後にある 'WaitOne' メソッドの呼び出しは false を返します。ブロックされたスレッドがない場合にのみ、戻り値は true になります。
上記の推論は正しいですか? また、正しい場合、その手法は私の問題に対処するための標準的な方法ですか? 主に .net コンパクト フレームワーク 2.0 プラットフォームでソリューションを使用しようとしています。
windows-phone-7 - 応答を待って操作を行うにはどうすればよいですか?
新しい問題が 1 つあります。応答でいくつかの操作を実行したいのですが、まだ到着していないため、NullReferenceException が発生します... これが私のコードです。
しかし、ManualResetEvent クラスを使用すると、if(dataReady.WaitOne()) 行が原因でアプリがハングします。以下は、ManualResetEvent クラスを含む完全なコードです。
それで、私の質問があります:どうすれば応答を待って操作を行うことができますか? (Application.DoEventメソッドを使おうとしましたが、WP7には存在しません...)
c# - Webservice: AsyncCall が終了しました: しかし、WaitOne() はまだ待機中です
- Command Line Exe を介して WebService メソッドを呼び出しています。
- このメソッド呼び出しは非同期呼び出しであり、呼び出しの後に WaitOne を使用しています。
- 完成したメソッドで ManualRest.Set() を実行しています。
上記のセットアップは、非同期メソッドが 10 ~ 20 分以内に返されるケースの 99% で正常に機能します。
Async Call に 2 ~ 3 時間かかり、WaitOne() の後のコードが実行されない場合に問題が発生します。
waitone() の前後と Completed イベントにもログを書き込んでいますが、3 時間の非同期呼び出しの後、コントロールが元に戻らないようです。
上記のヘルプ/ポインタ...
ありがとう。
asynchronous - ServiceBus で BeginReceive と EndReceive を使用したメッセージングが機能しない
バス上で非同期メッセージングが必要です。
これは私が使用しているコードです:
AsyncGet は次のとおりです。
私が得る出力は次のとおりです。
行 result.AsyncWaitHandle.WaitOne(); AsyncGet のスレッドが終了するまで実行を停止しませんでした。ここで何が間違っているのか教えてください。ありがとう!
windows-phone-7 - WP7とSkydriveWaitOneがすべてをブロック
SkyDriveからファイルをダウンロードしようとしていますが、非同期呼び出しを同期クラスにラップしました。ただし、WaitOneを呼び出すと、すべてがブロックされ、EventHandelerが呼び出されることはありません。
c# - すべてのイベントが発生した場合でも、WaitOne() は永久に待機します
Threaded は、4 つの個別のスレッドを作成し、それぞれが終了するまで待機することを想定しています。各スレッドはしばらくスリープし、共有ミューテックスオブジェクトが別のスレッドによって占有されていない場合にのみ終了し、終了したことをイベントを通じて通知します(これは私のコードの簡略化されたバージョンですが、同じ場所で失敗します)
しかし、何が起こるかというと、ほとんどの場合、メイン スレッドは一見ランダムに見える WaitOne() のいずれかで永遠に待機します。
また、コードの一部をコメントアウトする必要がありました。これは、予期しない動作がさらに発生したためです (つまり、各スレッドが終了した後、メイン スレッドが for 句に戻り、IndexOutOfBounds が発生します)。
どんな助けでも素晴らしいでしょう
c# - 非同期呼び出しの完了を待っている WaitHandle を使用するにはどうすればよいですか?
次のコードを検討してください。
結果があります:
だから、私は結果が欲しい:
async
このコードで待機するにはどうすればよいですか? MSDN の記事「Calling Synchronous Methods Asynchronously」を確認したところ、次のことがわかりました。
呼び出した後BeginInvoke
、次の操作を実行できます。
- いくつかの作業を行っ
EndInvoke
てから、呼び出しが完了するまでブロックを呼び出します。 -
プロパティを使用して を取得し、その
WaitHandle
メソッドを使用して が通知されるまで実行をブロックしてから、を呼び出します。IAsyncResultAsyncWaitHandle
WaitOne
WaitHandle
EndInvoke
IAsyncResult
によって返されたをポーリングしてBeginInvoke
、非同期呼び出しがいつ完了したかを判断してから、 を呼び出しますEndInvoke
。- コールバック メソッドのデリゲートを に渡します
BeginInvoke
。ThreadPool
非同期呼び出しが完了すると、スレッドでメソッドが実行されます。コールバック メソッドは を呼び出しますEndInvoke
。
私は今、私にとってより良い変種だと思います。しかし、これをどのように実装しますか?特に、オーバーロードWaitOne()
(現在の WaitHandle がシグナルを受信するまで現在のスレッドをブロックします) に興味があります。どのように正しく行うのですか?この場合の一般的なパターンを意味します。
アップデート:
今私は使用しますTask<T>
:
SomeMethod()
これが空になる主な問題list
。
結果:
今、私は巨大な解決策を持っています:(
結果:
それが、非同期呼び出しを待つ必要があるものです。ここはどう使えばいいWait
のTask
?
更新 2: