上次在看线程时,知道了委托.好不容易搞明白了委托怎么写,
原先的问题http://topic.csdn.net/u/20111019/17/ac098c48-ed25-4e1f-acd0-ec192ca44eac.html
又想知道线程什么时候结束,或者我想知道我授予线程的过程执行的怎么样了.
如是到网上查,omg,异步..回调执行,
我找了一个一例子,然后照葫芦画瓢,但是得不到正确的结果.
//我的以下是想实现将form的text修改一下,然后线程执行完毕后,提示我一下.
- VB.NET code
Imports System.Threading Imports System.Runtime.Remoting.Messaging Public Class Form1 Private Delegate Sub myDelegate(ByVal myString As String) '自定义一个委托 Dim MyThread As System.Threading.Thread Private Sub SetWindowText(ByVal myString As String) '与委托相同签名的函数或过程 Me.Text = myString End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click MyThread = New System.Threading.Thread(AddressOf sum) MyThread.Start() End Sub Private Sub sum() Dim sum As Single sum = Rnd() Dim b As myDelegate = New myDelegate(AddressOf SetWindowText) 'Me.Invoke(New myDelegate(AddressOf SetWindowText), sum.ToString) '委托的调用 'Me.Invoke(b, sum.ToString) '这儿将me.invoke替换为下面的BeginInvoke又会导致非法调用控件啊. Dim myar As IAsyncResult = b.BeginInvoke(sum.ToString, New AsyncCallback(AddressOf CallBackThread), "执行完毕!") End Sub Private Sub CallBackThread(ByVal myar As IAsyncResult) msgbox( "当前线程是:" & System.Threading.Thread.CurrentThread.ManagedThreadId) Dim ar As AsyncResult = CType(myar, AsyncResult) Dim b As myDelegate = CType(ar.AsyncDelegate, myDelegate) b.EndInvoke(myar) MsgBox(myar.AsyncState.ToString) End Sub End Class
请教在这一方面有兴趣和大神.
------解决方案--------------------
委托的意思是 在A线程中调用B线程的消息循环执行某段代码。
线程可以理解成一个独立的过程(SUB)。
当调用委托时,委托部分的代码将在另一线程中执行。
线程状态可以直接调用Thread的属性来查询。
线程中的代码执行的位置,只能用一些公共状态值来判断。
------解决方案--------------------
------解决方案--------------------
再补充一下
线程可以理解成一个独立的过程(SUB)。
过程结束(END SUB)时,也意味着线程结束。
在过程结束之前,调用的委托,有可能委托代码执行时,线程已经结束。
Invoke跟BeginInvoke是两个概念,Invoke由控件继承表示A线程让B线程上执行某段代码
BeginInvoke则表示在当前线程A上开启一个新线程B进行异步操作。
LZ的代码在A线程上启动了BeginInvoke,于是开启了线程B,当线程B返回EndInvoke时,直接调用了线程C上的控件,于是就报错了。
------解决方案--------------------
- VB.NET code
Private Delegate Sub BeginInvokeDelegate() Private Sub SetTextBoxText() lbl2.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") End Sub Private Sub ThreadMethod() Thread.Sleep(3000) Me.BeginInvoke(New BeginInvokeDelegate(AddressOf SetTextBoxText)) End Sub Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load Dim t As New Thread(AddressOf ThreadMethod) t.Start() lbl1.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") End Sub
------解决方案--------------------
Private Delegate Sub myDelegate(ByVal myString As String)
Dim MyThread As System.Threading.Thread
Private Sub SetWindowText(ByVal myString As String)
Debug.Print("SetWindowText线程是:" & System.Threading.Thread.CurrentThread.ManagedThreadId)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click