2

私は次のテストコードを持っています。何の役にも立ちませんが、VBを理解するためにあります。

Imports System
Imports System.IO
Imports System.Diagnostics
Imports Microsoft.VisualBasic
Imports System.Threading

Public Class Sandbox
    Public Shared num As NumericUpDown

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim objWrk As Worker
        objWrk = New Worker
        objWrk.Show()
    End Sub
End Class

Public Class Worker
    Public Sub Show()
        Dim runThread As New System.Threading.Thread(AddressOf Run)      ' Call the runner in a seperate thread
        runThread.Start()
    End Sub

    Public Sub Run()
        runToggle(1000)
    End Sub

    Public Delegate Sub runToggleInvoker(ByVal value As Integer)
    Public Sub runToggle(ByVal value As Integer)
        If Sandbox.Label1.InvokeRequired = True Then
            Sandbox.Label1.Invoke(New runToggleInvoker(AddressOf runToggle), value)
        Else
            Sandbox.Label1.Text = value
        End If
    End Sub
End Class

フォームはaButtonと。で構成されLabelます。

学習目的のために、別のスレッドのラベルのテキストを変更するメソッドを配置しました。ただし、InvokeRequired値は戻り続けFalseます。これはどのように可能ですか?はLabel1メインスレッドで作成され、runThreadで調整されているためInvokeRequired、Trueが得られるはずです。

ここで、これはフォームのハンドルがまだ作成されていないときに発生することを読んだので、Runメソッドを変更しました。

Public Sub Run()
            Sandbox.Show()
            runToggle(1000)
        End Sub

これは問題を解決しません。

4

1 に答える 1

3

Control.InvokeRequiredプロパティによると

コントロールのハンドルがまだ存在しない場合、InvokeRequiredは、ウィンドウハンドルを持つコントロールまたはフォームが見つかるまで、コントロールの親チェーンを検索します。適切なハンドルが見つからない場合、InvokeRequiredメソッドはfalseを返します。

于 2012-05-24T08:38:59.507 に答える