大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
如果需要等待T2线程结束,那又何必开启这个线程!!
站在用户的角度思考问题,与客户深入沟通,找到柯城网站设计与柯城网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站设计、网站建设、企业官网、英文网站、手机端网站、网站推广、申请域名、雅安服务器托管、企业邮箱。业务覆盖柯城地区。
直接:
Label1.Visible = True
setB()
MsgBox("d")
这不就是执行完setB(),再执行MsgBox("d"),多线程是多余的。
多线程的作用大多数也就用来同时执行多任务而不用等待的。
vb.net中如何结束一个线程
一般而言,如果您想终止一个线程,您可以使用System.Threading.Thread类的Abort方法. 例如:
Dim worker As ThreadStart = New ThreadStart(AddressOf workerthreadmethod)
Dim t As Thread = New Thread(worker)
t.Start()
MessageBox.Show("Wait for a while for the thread to start.")
MessageBox.Show(t.ThreadState.ToString())
t.Abort()
MessageBox.Show(t.ThreadState.ToString())
t.Join()
MessageBox.Show(t.ThreadState.ToString())
当然,在调用Abort方法后,线程并不是立刻终止,要等线程的所有finally快中的代码完成后才会完全终止. 所以在主线程中可以用Join方法来同步,当线程还未完全终止时,t.Join()将处于等待,直到t线程完全结束后再继续执行后面的语句。
Abort方法是会导致线程跳出一个异常错误的,你需要在代码中捕获该异常。下面是一个比较完整的VB.NET线程例子:
Imports System
Imports System.Threading
Public Class MyTestApp
Public Shared Sub Main()
Dim t As New Thread(New ThreadStart(AddressOf MyThreadMethod))
'Start the thread
t.Start()
MsgBox("Are you ready to kill the thread?")
'Kill the child thread and this will cause the thread raise an exception
t.Abort()
' Wait for the thread to exit
t.Join()
MsgBox("The secondary thread has terminated.")
End Sub
Shared Sub MyThreadMethod()
Dim i As Integer
Try
Do While True
Thread.CurrentThread.Sleep(1000)
Console.WriteLine("This is the secondary thread running.")
Loop
Catch e As ThreadAbortException
MsgBox("This thread is going to be terminated by the Abort method in the Main function")
End Try
End Sub
End Class
Thread.Abort()方法用来永久销毁一个线程,而且将抛出ThreadAbortException异常。使终结的线程可以捕获到异常但是很难控制恢复,仅有的办法是调用Thread.ResetAbort()来取消刚才的调用,而且只有当这个异常是由于被调用线程引起的异常。因此,A线程可以正确的使用Thread.Abort()方法作用于B线程,但是B线程却不能调用Thread.ResetAbort()来取消Thread.Abort()操作。
一: 利用错误捕获功能判断
Dim ArrayS() As String
Private Sub Command1_Click()
On Error GoTo z
ReDim ArrayS(10)
If UBound(ArrayS) -1 Then
MsgBox "数组不为空"
End If
Exit Sub
z:
MsgBox "数组空"
End Sub
二、 Join方法:
Dim ArrayS() As String
Private Sub Command1_Click()
If (CStr(Join(ArrayS, ""))) = "" Then
MsgBox "为空"
Else
MsgBox "不为空"
End If
End Sub
VB没有直接比较两个数组的方法或函数,需要自己变成解决。首先,如果两个数组(假定为a和b,下同)的类型都是Variant或者String,可以这样来比较:
If Join(a) = Join(b) Then
'a和b相等
Else
'a和b不相等
End If
如果数组的类型是数值型的,或者类型是不确定的,则比较复杂些了:
If VarType(a) VarType(b) Then
'类型不相等的可以判定为数组不相等
ElseIf UBound(a) UBound(b) Or LBound(a) LBound(b) Then
'元素个数不相等或者下标范围不相等的可以判定为数组不相等
Else '如果上述两个条件都符合,就要开始逐个比较了
'先假定两个数组相等
For i = LBound(a) To UBound(a)
If a(i) b(i) Then
'只要有一个不相等,就可以判定为数组不相等
Exit For '其他的就不需要再比较了
End If
Next i
End If
vb.net虽也有input语句,但一次只能读取到一个变量中,可以用TextFieldParser类代替,但似乎没以前的方便。不过比以前的更灵活。写入文件Write还是可以用,在Microsoft.VisualBasic.FileIO中。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim fileName As String = "E:\User Documents\Master\My Documents\电子阅读\股票\table2.csv"
Using Recrods As New Microsoft.VisualBasic.FileIO.TextFieldParser(fileName) '建立TextFieldParser对象
'MyReader.TextFieldType = FieldType.Delimited
Recrods.SetDelimiters(",") '把字段分隔符设置为","
Dim curRow() As String
Do Until Recrods.EndOfData
curRow = Recrods.ReadFields() '读取记录行,返回字符串数组,所以不同字段类型需要自己转换。
Debug.Print(Join(curRow, vbTab))
Loop
End Using
End Sub
虽然你的想法是在 LoginBtn_Click 事件中将复杂的操作分离出去以减轻UI的负担, 这很好完全没有问题.
但是问题在于 Me.Invoke(dh)这里,若是ChkLogin里面仍然是大规模的操作呢 你的代码就又变成将很复杂的操作扔给了UI, 当然会出现窗体无法拖动的情况了.
解决办法很简单, 很多种. 将ChkLogin()里的操作直接放在DelegateLogin()里面吧 me.invoke仅仅只是做简单的轻量的刷新之类的操作就好了.
希望能帮上你的忙.