从2加入多线程访问UI线程控件

时间:2016-03-14 05:44:08

标签: vb.net multithreading

我目前正在为我的公司开展一个小型自动更新项目。在对多线程进行一些研究之后,我设法构建了以下代码:

主题#01:

Private Sub startUpdate()
    If InvokeRequired Then
        Invoke(New FTPDelegate(AddressOf startUpdate))
    Else
        'some code here
    End If
End Sub

线程#02 ,由线程#01加入:

Private Sub startProcess()
    myThread = New Thread(Sub() startUpdate())
    myThread.Start()
    myThread.Join()

    'another code goes here

    Me.close
End Sub

当表单加载时访问线程#02:

Private Sub SUpdater_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    myThread1 = New Thread(Sub() startProcess())
    myThread1.Start()
End Sub

我坚持了两件事:

  • 我无法从第01号主题访问 Me.close 。它会触发错误:
      

    控制在另一个线程

  • 即使我打了另一个帖子,主表格也冻结了。

请帮我修复此错误。

非常感谢。

1 个答案:

答案 0 :(得分:0)

每次访问UI元素时都需要调用。调用Me.Close()开始处理所有表单元素(组件,按钮,标签,文本框等),导致与表单本身以及其中的所有内容进行交互。

您不需要调用的唯一内容是属性,您知道在获取或设置时不会修改UI上的任何内容,还有字段 (又名变量)。

例如,不需要调用它:

Dim x As Integer = 3

Private Sub Thread1()
    x += 8
End Sub

要解决您的问题,您只需要调用表单的结束。这可以使用委托来完成。

Delegate Sub CloseDelegate()

Private Sub Thread1()
    If Me.InvokeRequired = True Then 'Always check this property, if invocation is not required there's no meaning doing so.
        Me.Invoke(New CloseDelegate(AddressOf Me.Close))
    Else
        Me.Close() 'If invocation is not required.
    End If
End Sub