请教VB.net中怎么跨线程调用控件.

时间:2022-01-20 18:05:10
在某个线程中,可以调用某个过程,但在访问主窗体的控件时无效,怎么办?

9 个解决方案

#1


1。可以通过将 CheckForIllegalCrossThreadCalls 属性的值设置为 false 
2。使用Invoke。比如:

private void SetText(string text)
{
// InvokeRequired需要比较调用线程ID和创建线程ID
// 如果它们不相同则返回true
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox1.Text = text;
}
}

VB语法不清楚了。

#2



    '测试方法
    Public Sub TestThread()
        '创建一个线程
        Dim th As New Thread(AddressOf MyThreadProc)
        '启动线程
        th.Start()
    End Sub

    Public Sub MyThreadProc()
        '更新ui资源例子
        Me.Invoke(New VoidDelegate(AddressOf UpdateText))
    End Sub
    '定义委托
    Public Delegate Sub VoidDelegate()
    '定义方法
    Public Sub UpdateText()
        '实际更新界面
        Me.Text = "Modified by thread"
    End Sub

#3


Me.invoke一下搞定!
sub test
if me.invokerequierd=true then
me.invoke(new methodinvoker(adressof  test))
else
label1="Invoke Done!"
'你随便赋值啦
endif
end sub

#4


需要赋值的时候调用test就可以了

#5


引用 2 楼 wuyazhe 的回复:
VB.NET code

    '测试方法
    Public Sub TestThread()
        '创建一个线程
        Dim th As New Thread(AddressOf MyThreadProc)
        '启动线程
        th.Start()
    End Sub

    Public Sub MyThreadProc()
  ……


 过程 UpdateText() 不能够带参数?

#6


1.Control.CheckForIllegalCrossThreadCalls =False

2.委托、Invoke

#7


Invoke

#8


引用 6 楼 xxc168 的回复:
1.Control.CheckForIllegalCrossThreadCalls =False

2.委托、Invoke

第一种方法除非十分小的程序,十分不推荐

#9


sometimes,i feel the program what is a amazing
Especially this one:
me.invoke(new methodinvoker(adressof test))
引用 3 楼 cmlr_ 的回复:
Me.invoke一下搞定!
sub test
if me.invokerequierd=true then
me.invoke(new methodinvoker(adressof test))
else
label1="Invoke Done!"
'你随便赋值啦
endif
end sub

#1


1。可以通过将 CheckForIllegalCrossThreadCalls 属性的值设置为 false 
2。使用Invoke。比如:

private void SetText(string text)
{
// InvokeRequired需要比较调用线程ID和创建线程ID
// 如果它们不相同则返回true
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox1.Text = text;
}
}

VB语法不清楚了。

#2



    '测试方法
    Public Sub TestThread()
        '创建一个线程
        Dim th As New Thread(AddressOf MyThreadProc)
        '启动线程
        th.Start()
    End Sub

    Public Sub MyThreadProc()
        '更新ui资源例子
        Me.Invoke(New VoidDelegate(AddressOf UpdateText))
    End Sub
    '定义委托
    Public Delegate Sub VoidDelegate()
    '定义方法
    Public Sub UpdateText()
        '实际更新界面
        Me.Text = "Modified by thread"
    End Sub

#3


Me.invoke一下搞定!
sub test
if me.invokerequierd=true then
me.invoke(new methodinvoker(adressof  test))
else
label1="Invoke Done!"
'你随便赋值啦
endif
end sub

#4


需要赋值的时候调用test就可以了

#5


引用 2 楼 wuyazhe 的回复:
VB.NET code

    '测试方法
    Public Sub TestThread()
        '创建一个线程
        Dim th As New Thread(AddressOf MyThreadProc)
        '启动线程
        th.Start()
    End Sub

    Public Sub MyThreadProc()
  ……


 过程 UpdateText() 不能够带参数?

#6


1.Control.CheckForIllegalCrossThreadCalls =False

2.委托、Invoke

#7


Invoke

#8


引用 6 楼 xxc168 的回复:
1.Control.CheckForIllegalCrossThreadCalls =False

2.委托、Invoke

第一种方法除非十分小的程序,十分不推荐

#9


sometimes,i feel the program what is a amazing
Especially this one:
me.invoke(new methodinvoker(adressof test))
引用 3 楼 cmlr_ 的回复:
Me.invoke一下搞定!
sub test
if me.invokerequierd=true then
me.invoke(new methodinvoker(adressof test))
else
label1="Invoke Done!"
'你随便赋值啦
endif
end sub