VB.NET线程控制窗体 vbnet timer多线程

VB点虐 可以多线程控制同一个窗体及其控件吗

不可以,但是能够在主线程的基础上调用委托(Invoke)。(主线程会被占用)

网站的建设创新互联公司专注网站定制,经验丰富,不做模板,主营网站定制开发.小程序定制开发,H5页面制作!给你焕然一新的设计体验!已为成都自拌料搅拌车等企业提供专业服务。

例子:

Dim thr As Threading.Thread

Public Delegate Sub VoidDelegate()

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

thr = New Threading.Thread(AddressOf Where)

thr.Start()

End Sub

Public Sub Where()

Me.BeginInvoke(New VoidDelegate(AddressOf WhereThr))

End Sub

Public Sub WhereThr()

Me.TextBox.text="0123456789"

End Sub

(Invoke)这种情况下,主线程被占用,所有由主线程执行程序,都将被(wherethr函数执行结束)后执行。

VB.NET中如何创建多个任务(每个任务一个线程),窗体上有一个listview

多线程操控同一个空间容易出现混乱,可通过SyncLock语句,将对空间的操作添加至lock语句内部,

Class simpleMessageList

Public messagesList() As String = New String(50) {}

Public messagesLast As Integer = -1

Private messagesLock As New Object

Public Sub addAnotherMessage(ByVal newMessage As String)

SyncLock messagesLock

messagesLast += 1

If messagesLast  messagesList.Length Then

messagesList(messagesLast) = newMessage

End If

End SyncLock

End Sub

End Class

参考:

vb点虐 中开一个线程,直到新窗体启动完成

虽然你的想法是在 LoginBtn_Click 事件中将复杂的操作分离出去以减轻UI的负担, 这很好完全没有问题.

但是问题在于 Me.Invoke(dh)这里,若是ChkLogin里面仍然是大规模的操作呢 你的代码就又变成将很复杂的操作扔给了UI, 当然会出现窗体无法拖动的情况了.

解决办法很简单, 很多种. 将ChkLogin()里的操作直接放在DelegateLogin()里面吧 me.invoke仅仅只是做简单的轻量的刷新之类的操作就好了.

希望能帮上你的忙.


网站名称:VB.NET线程控制窗体 vbnet timer多线程
网站地址:http://myzitong.com/article/ddeggei.html