1

Windows フォームを更新する必要があるスレッドがあります。ここからコードを使用する:

http://www.dreamincode.net/forums/blog/143/entry-2337-handling-the-dreaded-cross-thread-exception/

クロススレッドの例外を避けるため。

コントロールを更新しましたが、GUI が更新されず、新しい値が表示されません。それらが更新されていることを確認するために、値を読み取り、設定してから、再度読み取り、両方の場合に結果を出力しています。

任意のコントロールにスレッド セーフな更新をトリガーするために使用できるカスタム イベントを追加するコード (これはスレッド ライブラリに含まれています) は次のとおりです。

Imports System.ComponentModel
Imports System.Runtime.CompilerServices

Public Module MyInvoke
    <Extension()>
    Public Sub CustomInvoke(Of T As ISynchronizeInvoke)(ByVal control As T, ByVal toPerform As Action(Of T))
        If control.InvokeRequired Then
            control.Invoke(toPerform, New Object() {control})
        Else
            toPerform(control)
        End If
    End Sub
End Module

スレッドが更新を強制する場合、次のように実行されます。

' Read initial label text and write it out
Dim labelText As String = Form1.Label1.Text
Console.WriteLine("Label: " & labelText)

' Change value of label text, re-read it and write it out
Form1.Label1.CustomInvoke(Sub(l) l.Text = "Hello World")
labelText = Form1.Label1.Text
Console.WriteLine("Label: " & labelText)

このコードはテキストを変更しますが、GUI では更​​新されず、「Label1」として表示されます。スレッドを再度トリガーすると、変更された値 (Hello World) が正しく読み取られますが、GUI ではまだ更新されません (Label1 が表示されます)。

私はそれを更新しようとしました: Form1.Label1.CustomInvoke(Sub(l) l.Refresh()) 成功しませんでした。私は何を間違っていますか?

ティア

4

1 に答える 1