专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > VB Dotnet

【异步编程】异步执行,获取返回值,该如何处理

发布时间:2011-06-23 16:02:27 文章来源:www.iduyao.cn 采编人员:星星草
【异步编程】异步执行,获取返回值
上次在看线程时,知道了委托.好不容易搞明白了委托怎么写,
原先的问题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的属性来查询。

线程中的代码执行的位置,只能用一些公共状态值来判断。


------解决方案--------------------
探讨
上次在看线程时,知道了委托.好不容易搞明白了委托怎么写,
原先的问题http://topic.csdn.net/u/20111019/17/ac098c48-ed25-4e1f-acd0-ec192ca44eac.html
又想知道线程什么时候结束,或者我想知道我授予线程的过程执行的怎么样了.
如是到网上查,omg,异步..回调执行,
我找了一个一例子,然后照葫芦画瓢,但是得不到正确的结果……

------解决方案--------------------
再补充一下

线程可以理解成一个独立的过程(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
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: