首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从两个连接多线程访问UI线程控件

从两个连接多线程访问UI线程控件
EN

Stack Overflow用户
提问于 2016-03-14 05:44:07
回答 1查看 144关注 0票数 1

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

线程#01 :

代码语言:javascript
复制
Private Sub startUpdate()
    If InvokeRequired Then
        Invoke(New FTPDelegate(AddressOf startUpdate))
    Else
        'some code here
    End If
End Sub

线程#02,由线程#01连接:

代码语言:javascript
复制
Private Sub startProcess()
    myThread = New Thread(Sub() startUpdate())
    myThread.Start()
    myThread.Join()

    'another code goes here

    Me.close
End Sub

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

代码语言:javascript
复制
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。它会触发一个错误:控件位于另一个线程中。
  • 即使我调用了另一个线程,主表单仍然僵住了。

请帮我改正这个错误。

非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-14 16:37:50

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

惟一不需要调用的是您知道在获取或设置时不会修改UI中任何内容的属性,以及字段(也称为变量)。

例如,不需要调用:

代码语言:javascript
复制
Dim x As Integer = 3

Private Sub Thread1()
    x += 8
End Sub

要解决问题,只需调用表单的闭包即可。这可以简单地使用委托来完成。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35980288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档