0

.Post()を介してAsyncOperationによって呼び出されるUpdate()メソッドがあります。その関数にMessageBoxを配置すると、複数のメッセージボックスが表示され、その理由を理解しようとしています。

メッセージボックスは、「OK」がクリックされるまでUpdate()の実行を停止する必要がありますが、.Post()が原因で、Update()が再入力され、前のメッセージボックスが閉じられる前に次のメッセージボックスが表示されます。

私が最初に考えたのは、SyncLockをUpdate()に配置して、同時に実行できないようにすることでしたが、効果はありませんでした。メッセージボックスに.ManagedThreadIDを出力すると、すべての呼び出しが同じスレッドIDを持つため、SyncLockは異なるスレッドのみをブロックするため、効果がないように見えます。

それで、誰かがここで何が起こっているのか説明できますか?1つのスレッドで同じ機能を同時に実行するにはどうすればよいですか?

4

1 に答える 1

0

メッセージボックスは、それが表示されているスレッドでのみモーダルです。必要に応じて、あなたの場合のUIスレッド。ワーカースレッドがPost()を呼び出すのを防ぐことはできないため、メッセージボックスが増え続けます。SyncLockも機能せず、同じスレッドで再入可能です。MessageBox.Show()呼び出しの前にtrueに設定し、後でfalseに設定した単純なブールフラグは、ジョブを実行します。trueに設定されている場合は、Showを再度呼び出さないでください。

または、MessageBoxを使用しない場合は、Debug.Print()をトレースするのが良い方法です。デフォルトでは、テキストは[出力]ウィンドウに表示されます。デバッガーブレークポイントも驚異的なことをすることができます。

于 2011-10-30T15:25:27.510 に答える