0

コントロールを含むスレッドとは異なるスレッドからコントロールを更新する問題を解決する方法をインターネットで読んでいて、「Pro VB 2010と.Net 4.0プラットフォーム」も読んでいて、疑問に思い始めました。次のコードは同期的に実行されていますか?

Private Sub SaveData(ByVal filepath As String)
   If InvokeRequired Then
      Me.Invoke(New MethodInvoker(AddressOf SaveData))
   Else
      ... the actual code
   End If
End Sub
4

3 に答える 3

0

このInvokeメソッドは、デリゲートが UI スレッドでの実行を終了するまで、呼び出しスレッドをブロックする同期呼び出しです。

BeginInvoke()スレッドを呼び出してすぐに (UI スレッドのコードが実行される前に) 続行する場合は、非同期の を呼び出します。

于 2013-02-15T19:38:18.863 に答える
0

呼び出しコンテキストに大きく依存します。

UI スレッドまたはメイン スレッドから呼び出している場合は、同期的に機能します。

UI またはメイン スレッドではないスレッドから呼び出すと、UI またはメイン スレッドに対して非同期に機能しますが、呼び出し元のスレッドとは同期的に機能し、UI またはメイン スレッドがデリゲートの処理を完了するまで待機します。

したがって、それは双方向に行くことができます。同期および非同期で動作できます。あなたが見逃しているのは、コード自体が同期または非同期の方法で実行されず、コードの実行が同期または非同期のいずれかであるということだと思います。

update 関数を作成する理由:

Private Sub UpdateLabel(byval tLabel as Label, byval Value as String)
    If tLabel.Invokerequired Then
         Me.Invoke(New MethodInvoker(AddressOf UpdateLabel)
    Else
        tLabel.Text = Value
    End If
End Sub

クロススレッド例外を心配することなく、テキストを変更したいときにいつでも呼び出すことができるようにするためです。

このメソッドは、クリック イベント中に UI スレッドから安全に呼び出すことができます。また、実行中のバックグラウンド スレッドから安全に呼び出すこともできます。これは、変更が UI またはメイン スレッドでのみ行われるためです。このようなコードを使用して、他のスレッドが所有するコントロールへの変更との同期を確保します。

このスタイルの更新は、変更を同期し、クロススレッドを回避することを目的としています。

于 2013-02-15T19:38:09.197 に答える