問題タブ [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.
c# - WaitHandleを待っている間にメッセージループを実行する
UIスレッドがWaitHandleまたは他のスレッドプリミティブで待機している間にすべてのWindowsメッセージを処理する方法はありますか?
私は、それが非常に厄介な再入可能性の問題を引き起こす可能性があることを認識しています。とにかくやりたいです。
編集:待機は、UIスレッドで実行する必要がある複雑な関数の途中で発生します。したがって、待機をバックグラウンドスレッドに移動することはできません。(関数を2つに分割すると、複雑で保守不可能な混乱が発生します)
.net - パフォーマンス プロファイリングの目的で WaitHandle.SignalAndWait の呼び出しを無視できますか?
Red Gate から ANTS Performance Profilerの試用版をダウンロードし、チームのコードの一部を調査しています。すぐに、ANTS が最大 99% の CPU 時間を消費していると報告しているコードの特定のセクションがあることに気付きました。
私はANTSや一般的なパフォーマンスプロファイリングに完全に慣れていません(つまり、 のような非常に粗雑で眉をひそめている方法であると確信しているものを使用した自己プロファイリングは別としてdouble timeToComplete = (endTime - startTime).TotalSeconds
)、まだアプリケーションをいじって考えていますそれがどのように使用されているかを示します。しかし、問題のコードの責任者である開発者に電話をかけたところ、彼の反応はすぐに次のようになりました。は CPU をまったく使用せず、何かが行われるのを待っているだけです。」彼は、単にそのコードを無視して、他に見つけられるものを探すようにアドバイスしてくれました。
私の質問: SignalAndWait が CPU オーバーヘッドを必要としないというのは本当ですか (もしそうなら、これはどのように可能でしょうか?)、そしてパフォーマンス プロファイラーがそれを 99% の CPU 時間を占有していると見なすのは合理的ですか? これが特に興味深いのは、99% の場合、アプリケーションが頻繁にアイドル状態になっていることを示しているからです。それでも、最近はそのパフォーマンスがかなり鈍くなっています。
私が言ったように、私はこのツールに関しては本当に初心者であり、WaitHandle クラスについては何も知りません。したがって、ここで何が起こっているのかを理解するのに役立つ情報があれば幸いです。
c# - Windows サービスの場合、待機スピンとタイマーのどちらが優れていますか?
Windows サービスのタイマーに関するこの質問により、次のように考えるようになりました。
WaitHandleで待機している Windows サービスがあるとします (そして、私はそうしています)。
ウェイトスピン図 http://www.86th.org/waitspin.jpg
タイマーを使用する方がウェイトスピンループ(スピンウェイトと呼ばれることもあります) よりも優れているかどうか興味があります。正直なところ、私はタイマーを自分のいじくり回し以外に使用したことがありません。
違いが大きく、Timer を使用するメリットが驚くべきものでない限り、切り替える予定はありません。しかし、私は、このプロジェクトの将来の発展のために、一方と他方に対する人々の考えに非常に興味があります.
これがウィキであるべきかどうか教えてください
c# - WaitHandle.WaitAny および Semaphore クラス
編集:この質問をすることさえ一時的な狂気を認めたいと思いますが、当時は理にかなっていました(以下の編集2を参照)。
.NET 3.5 プロジェクトの場合、2 種類のリソース ( R1とR2 ) が利用可能かどうかを確認する必要があります。各リソース タイプは、いつでも (たとえば) 10 個のインスタンスを持つことができます。
いずれかのタイプのリソースが利用可能になったら、ワーカー スレッドを起動する必要があります (スレッドの数は可変です)。以前の実装では、リソースの種類は 1 つしかなく、セマフォを使用して可用性を確認していました。
ここで、リソースの可用性を追跡する 2 つの別個のセマフォ ( S1とS2 ) を待機する必要があります。
ただし、これには 1 つの問題があります。次の MSDN ドキュメントからWaitAny
:
呼び出し中に複数のオブジェクトがシグナル状態になった場合、戻り値は、すべてのシグナル状態のオブジェクトの中で最小のインデックス値を持つシグナル状態のオブジェクトの配列インデックスです。
これは、 を呼び出した後、両方のセマフォ カウントを 1 減らした可能性があることを示唆していWaitAny
ます。signalledHandle
s1 が通知されたことを示すため、リソースR1の使用を開始し、完了したら解放します。ただし、 S2が通知されたかどうかがわからないため、このリソースの可用性カウントはオフになっている可能性があります。これが 10 回発生すると、私のセマフォは永久に「空」になり、リソースR2はまったく使用されなくなります。
これに対処する最善の方法は何ですか?2 つのセマフォを単純なカウンターと AutoResetEvent の使用に切り替えて、いずれかのカウンターが変更されたときに通知する必要がありますか? もっとエレガントなアプローチが欠けていますか?
編集 1:
Ravadre によると、セマフォの 1 つだけが実際に変更されWaitAny
ます。彼の例を少し変更するとこれが確認されるようですが、これを指定している公式ドキュメントを教えてくれる人はいますか?
編集 2:
帰り道にこれについて考えていました。その時初めて、これが何の役にも立たないということに気がつきましたWaitAny
。この問題はセマフォに限定されるものではなく、ほぼすべてのタイプの同期オブジェクトで発生し、WaitAny
実質的に役に立たなくなります。
.net - ミューテックスは正しく実装されていますか?どうすれば破棄できますか?
いくつかのコードを見直していますが、コード分析 (fxCop) の警告の 1 つに非常に混乱しています。このコードは、次のように、クラスの開始時に変数を作成することにより、いくつかのミューテックスを実装します。
fxCop は、Mutex クラスが実装しているため、クラスに IDisposable を実装する必要があるというメッセージを表示しています。これは警告CA1001です。ただし、Mutex を見ると、dispose メソッドがありません。
Mutex はSafeWaitHandle (これは IDisposable を実装しています - これが fxCop が拾っているものだと推測します) を使用しますが、mutex は実際には標準の破棄可能なパターンを介してそれを破棄しません。RuntimeHelpers.CleanupCodeを使用してデリゲートに割り当てられるプライベート メソッドがあります。これは、私が理解しているように、例外で実行されることを意味します。
これにより、次の 2 つの疑問が生じます。
- Mutex は正しく実装されていますか? Mutex に例外がない場合、SafeWaitHandle は破棄されません。
- ミューテックスをクリーンアップするには、dispose で何を呼び出す必要がありますか?
c# - WaitHandle.WaitAny()およびWaitHandle.WaitAll()の使用上の問題
アプリケーションが正しく終了していません。接続の総数を出力しようとしています。その後、すべてのアップロード操作が完了するのを待ってから、正常に終了します。
以下はコードです...
c# - 私の EventWaitHandle は「パスへのアクセスが拒否されました」と言っていますが、そうではありません
私が今知っていることの簡単な要約
作成してEventWaitHandle
閉じた があります。この ctorで再作成しようとすると、「パスへのアクセス ... が拒否されました」という例外がスローされます。この例外はまれであり、ほとんどの場合、問題なく再作成されますEventWaitHandle
。以下に(私が)投稿した回答を使用するEventWaitHandle.OpenExisting
と、例外がスローされた場合でも正常に呼び出して続行できますが、ctor はEventWaitHandle
私のためにこれを行うべきでしたよね? それがout パラメータ,createdNew
の目的ではありませんか?
最初の質問
同じサーバー上に次のアーキテクチャ、Windows サービス、および Web サービスがあります。Web サービスは、Windows サービスが待機している待機ハンドルを開いて設定することにより、作業を行う必要があることを Windows サービスに伝えます。
通常、すべてに問題はなく、問題が発生することなく Windows サービスを開始/停止できます。ただし、Web サービスを停止してから再起動すると、待機ハンドルを完全に作成できず、アーキテクチャ全体が壊れてしまうことがあります。
特に、何がイベント待機ハンドルを壊しているのかを突き止めて停止する必要があります。待機ハンドルが「壊れた」場合、ウィンドウが再び適切に機能する前にウィンドウを再起動する必要がありますが、これは明らかに理想的ではありません。
更新: スローされた例外と問題のログ
問題を引き起こすことを期待して、Web サービスが動作している間に Windows サービスを再起動しました。一部のクラス名は、企業の匿名性のために検閲されています
大まかなタイムライン:
11:53:09,937: Web サービスの最後のスレッドが既存の待機ハンドルを開き、その作業を完了しました (クライアントとの接続が終了した場合と同様)。
12:00:30,234: Web サービスは新しい接続を取得しますが、まだ待機ハンドルを使用していません。この接続のスレッド ID は、11:53 の最後の接続のスレッド ID と同じです。
12:00:41,250: Windows サービスが停止します
12:00:42,781: Windows サービスが起動します
12:00:43,078: Windows サービスのクラッシュが終了しました
12:00:50,234: Web サービスは実際に待機ハンドル呼び出し Set() を開くことができましたが、例外がスローされることはありませんでした。
12:02:00,000: Windows サービスを再起動しようとしましたが、同じ例外が発生しました
12:36:57,328: 任意に 36 分間待った後、システムを完全に再起動することなく、Windows サービスを開始することができました。
Windows サービス コード
初期化:
利用:
廃棄/閉鎖:
Web サービス コード
初期化:
利用:
は Web サービスのメンバー変数であるためEventWaitHandle
、具体的に閉じるコードはありません。実際、EventWaitHandle
オン ザ Web サービスと対話する唯一のコードは上に掲載されています。
振り返ってみるとClose()
、catch
ブロック内にある をブロック内に置くべきだったのかもしれませんfinally
。おそらく Web サービスに対しても同じことを行うべきだったのですが、それが必要だとは思いませんでした。
いずれにせよ、私が特に間違ったことをしているかどうかは誰にもわかりますか? close ステートメントを finally ブロック内に配置することは非常に重要ですか? Web サービスClose()
のを手動で制御する必要がありますか?existing_ewh
また、これはやや複雑な問題であることは承知しています。追加情報が必要な場合はお知らせください。詳しく監視し、必要な情報や説明を追加します。
参考資料
mysql - AJAX-時限mySQLクエリ(画面をお待ちください)
ページの読み込み時とその後5〜10秒ごとにデータベースにクエリを実行するAJAXページを作成する必要があります。その間、私はある種の待機ページを表示します(おそらく、顧客を楽しませ続けるためにアニメーションGIFを使用します:))
私はペイパルIPNを使用しているので、トランザクションがクリアされるのを待っている間、ほとんどの場合、ユーザーが戻る前にクリアしますが、そうでない場合もあります。したがって、誰かがそのようなコードを持っているか、そのようなコードの方向に私を向けることができれば、それは素晴らしいことです。
c# - AutoResetEventを持つプロデューサーコンシューマー
生産者/消費者パターンを使用して、一部のデータを処理および保存しようとしています。私は2つのtherad間のシグナリングにAutoResetEventを使用していますここに私が持っているコードがあります
これがプロデューサー機能です
そしてここに消費関数があります
したがって、私の問題は、キューが空であるためにresultQueue.Dequeue()がInvalidOperation例外をスローすることです。何が間違っているのかわからないので、シグナルを送信するべきではありません。そのブロックの上のWaitOne()は、キューが空ですか?
c# - マルチスレッド - すべてのスレッドが通知されるのを待機
64 を超える可能性のある一連のスレッドのすべてが作業を完了するまで待機するメイン スレッドが必要なシナリオがあり、そのために次のヘルパー ユーティリティを作成しました (64 の waithandle 制限を回避するためWaitHandle.WaitAll()
) 。
ただし、このユーティリティメソッドでは、配列内の先行するすべての待機ハンドルが通知された後にのみ各待機ハンドルが検査されます...したがって、事実上同期であり、待機ハンドルが autoResetEvent 待機ハンドルである場合は機能しません (これは、待機中のスレッドが解放されました)
この問題を解決するために、このコードを次のように変更することを検討していますが、他の人にそれが機能するように見えるかどうか、または誰かがそれに問題があるかどうか、またはより良い方法を提案できるかどうかを確認してもらいたいです...
前もって感謝します: