3

これは非常に簡単な質問かもしれませんが、確信が持てませんでした。モジュールにこれがあります:

Public theHandle As IntPtr

そして、これは Form1 という名前のメイン フォームで:

Private Sub Form1_HandleCreated(sender As Object, e As System.EventArgs) Handles Me.HandleCreated
    theHandle = Me.Handle
End Sub

他にも多くのクラス、モジュール、スレッドがあり、を使用せずInvokeRequiredに、どこからでもデリゲートを呼び出すためにこれを使用しています。つまり、他のスレッド、クラス、モジュールなどから..

DirectCast(Form1.FromHandle(theHandle), Form1).Invoke(D_Calculate)

それ以外の:

D_Calculate.Invoke()

それは悪い習慣ですか?InvokeRequired毎回チェックする目的は本当にありますか?

4

1 に答える 1

6

InvokeRequiredマルチスレッドの場所を確認するだけで、更新をマーシャルしてUIスレッドに戻す必要があります。

スレッドモデルを定義して理解し、スレッドの境界がどこにあるか、そしてこのチェックが必要なポイントを正確に知っている必要があるため、どこでも使用することはおそらく良い考えではないと私は主張します。

基本的に「これがUIスレッドだけで呼び出されるかどうかはわかりません」と言っているところならどこでも自由にスピンルすると、(実際に複数のスレッドがあると仮定すると)デバッグの苦痛の世界につながります。ポイントを逃したか、結果として他の非スレッドセーフコードが実行されたことがわかります。

于 2013-01-25T08:42:04.593 に答える