WaitOne()を呼び出す前にC#System.Threading.AutoResetEventまたは System.Threading.ManualResetEventのブロッキング状態をチェックすることはできますか?C#でAutoResetEventまたはManualResetEventのブロック状態をチェックする方法は?
答えて
EventWaitHandleには「ブロッキング状態」がありません。それは設定され、リセットされます。そして、いいえ、WaitOne()を呼び出す以外の方法で確認することはできません。
ブロッキングを避けるために、time-out引数に0を渡すことができます。これはWaitOne()呼び出しが復帰した後のイベントの状態について何も言わないので、しばしば非常に悪い考えです。その後、ナノ秒を変更した可能性があります。これは "スレッドレース"と呼ばれる非常に厄介な種類のバグを引き起こします。 Heisenbug。
+1、完全にあなたに同意する! –
私はEventWaithandleがブロッキング状態ではないことを知っていますが、通知されていない場合は現在のスレッドの実行をブロックしています。私はスレッド内で動作するループ中に4つのEventWaitHandlesを持っています。それらのうちのいくつかは条件付きでスレッドをブロックする必要があります。私は、これらの4つのハンドルのどれがブロックされているかを他のイベントから知りたいと思っていました。これらの情報を取得するには、ハンドルにリンクされたブール変数を追加する必要があることがわかります。 – Patrik
MSDNによると、タイムアウトは0で使用
public virtual bool WaitOne(
TimeSpan timeout
)
それはすぐにWaitHandleの状態を返します。
これに言及します。 AutoResetEventのWaitOne(0)がリセットされる可能性があります。 WaitOneがシグナルされた場合は、WaitOneの後にSetを使用する必要があります。しかし、私は競争条件についてHansに同意しなければならない。あなたがWaitOneを呼び出した複数のスレッドがある場合、これは厄介なバグを引き起こす可能性があります。 ManualResetEventでは問題ありません。 – BlueM
私は同じ質問をしました。デモアプリケーションを作成するだけです。あなただけのこの操作を行うと、そのインスタンスのブロッキング状態を確認する必要が任意の時点で
Module Module1
Dim ewh As Threading.EventWaitHandle
Sub Main()
ewh = New Threading.EventWaitHandle(False, Threading.EventResetMode.ManualReset)
' Do other work.
End Sub
Sub checkBlockStatus()
ewh.WaitOne()
End Sub
Function isEwhBlocked() As Boolean
Dim testEwhBlock As New Threading.Thread(AddressOf checkBlockStatus)
testEwhBlock.Start()
Threading.Thread.Sleep(1000)
If testEwhBlock.ThreadState <> Threading.ThreadState.Stopped Then
' It's OK to use abort here because I don't care what happens to the thread.
testEwhBlock.Abort()
Return True
Else
Return False
End If
testEwhBlock = Nothing
End Function
End Module
:(。EventWaitHandleへの初心者は)
これは私が(VB.NETで)問題を解決する方法です。
if (isEwhBlocked()) Then
' This means the block is on.
else
' No block.
End If
だから、いいえ、あなたは本当にWAITONE()を呼び出す前にブロックされているかを把握することはできませんが、あなたのメインスレッドを押収するのを防ぐ非同期方法でそれを実行することができます。もしそれが待たなければならないのであれば、おそらく睡眠の値をかなり下げることもできます。
明らかに、複数のブロックをチェックする必要がある場合、関数は少し複雑になります(またはそれらをさらに作成する必要があります)が、これは基本原理を示しています。私はこれをAutoResetとしてもテストしましたが、それはうまく動作しません。ハンドラが自動設定されているので、ブロックをチェックするメソッドを呼び出すと、他のスレッドをリセットしてブロックします。したがって、ManualResetで実行できる場合、これはあなたのために働くことができます。
- 1. Crm 4.0のチェックボックスのチェック状態を取得する方法は?
- 2. MVC 3のコントローラで、チェックボックスのチェック状態/チェック解除状態をコントローラのビューから読み取る方法
- 3. シェルコマンド(at91sam9260ボード)でgpioの状態を制御/チェックする方法
- 4. ユニックス状態チェック!
- 5. Simulinkで状態空間ブロックを持つMIMOモデルを実装する方法は?
- 6. チェックボックスのチェック状態をカスタムアクション(WIX)から変更する方法
- 7. Cでキーを押したときのシフトキーの状態を知る方法は?
- 8. アプリケーションの起動時にsql接続の状態をチェックする方法は?
- 9. チェック状態が不確定の場合、チェックをfalseに設定する方法
- 10. チェックボックスの状態を変数でチェックします。チェックボックス(i)。チェック?
- 11. Meteorアプリケーションのサーバー状態とユーザー、状態の作成方法は?
- 12. C#で状態マシンを書き込む方法は?
- 13. 現在の状態の状態グループまたは実際の状態オブジェクトを簡単に取得する方法はありますか?
- 14. SlimDX - 状態ブロックを設定する
- 15. C#でdatagridviewのセル状態を取得する方法
- 16. dispatch_asyncブロックのチェック方法は終了しました
- 17. コンポーネントを状態に渡す方法は?
- 18. C++ TR2ファイルシステムライブラリの状態は?
- 19. iptablesの状態をチェックしてubuntuでipを許可する方法
- 20. C#の:ManualResetEvent
- 21. javaのコンパイルされたクエリでより小さい状態をチェックする方法は?
- 22. C#でプログラムの状態を保存するクイックで汚れた方法
- 23. Reactアプリで許可チェックを処理する方法(状態はReduxで維持されます)?
- 24. wxWidgetsのリボンでtoggleButtonの状態を取得する方法は?
- 25. 空の状態をチェックするための空の条件
- 26. ミュート状態を確認する方法はありますか?
- 27. DelphiまたはC#を使用してHyper-Vで仮想マシンの状態を取得する方法
- 28. ListViewでViewPagerの状態を維持する方法は?
- 29. この状態でクロスドメインAjaxを実行する方法は?
- 30. アンドロイドでアクティビティの状態を保存する方法は?
反射を使用します。あなたの実際の問題は何ですか? –
私は特別なハードウェアと話すUDPクライアントを開発しています。私はコミュニケーションを同期させるためにブロックコードを実装しなければなりませんでした。私はWaitOne()の前にブレークポイントを置くことができないので、物事は速く走らなければなりません。私は4つのAutoResetEventsを持っています。コミュニケーションのブロックが私が魔女1で知りたかった時。私は、コンソールへのライティングは、ライティングにどこの時間がかかるかを示してくれることを知っています。そのような重要な環境では、時間を無駄にすることはできません。 – Patrik