Me.BeginInvoke(委托,参数)但是我想获得该异步操作结束后的事件,如何处理
New AsyncCallback(AddressOf Me.AfterDownLoad),这个东西在委托的异步操作中没有问题
在Control.BeginInvoke的异步操作如何传递进取呢??转来转去让我糊涂了

解决方案 »

  1.   

    但是我想获得该异步操作结束后的事件,如何处理 
    --------------------
    調用EndInvoke        'ParamObj是你要傳遞到AfterDownLoad的參數,如果不想傳遞,可用Nothing代替
            Dim paramObj As Object = New Object()
            'Control.BeginInvoke異步調用,會在Control的線程(通常即主線程)上執行Me.AfterDownLoad方法
            Dim ar as IAsyncResult= Control.BeginInvoke(New AsyncCallback(AddressOf Me.AfterDownLoad), paramObj)
           '調用EndInvoke之後,在該委托完成之前,當前線程會一直阻塞
           Control.EndInvoke(ar)    Private Sub AfterDownLoad(ByVal ar As IAsyncResult)
           '你的代碼
        End Sub
      

  2.   


    1、保证线程的流畅,用了EndInvoke,还怎么执行以下的代码??和同步运算没区别了
    2、你的代码里面,传递了AsyncCallback?这里应该执行的是事件Sub,呵呵~~不应该是回调Sub谢谢你,不过还是不行的
      

  3.   

    2、你的代码里面,传递了AsyncCallback?这里应该执行的是事件Sub,呵呵~~不应该是回调Sub 
    -------------------
    不好意思,的確是弄錯了,手寫的。
    1、保证线程的流畅,用了EndInvoke,还怎么执行以下的代码??和同步运算没区别了
    ------------------
    何謂線程的流暢?你衹是想在委托執行完成後執行一段代碼?那么直接將要執行的代碼放到目標方法中的後面即可。
    Control.BeginInvoke,是通過發送消息給創建Control的線程(通常為窗體線程),窗體消息處理時會執行該目標方法。
      

  4.   

    1、Control.BeginInvoke做事件A
    2、然后主线程去做事件B
    3、事件A完成后执行C
    现在A的引发肯定没有问题,B也没有问题,但是如何激发C呢——前提是不影响B的持续执行
      

  5.   

    BeginInvoke里的回调函数不可以吗?
      

  6.   

    哦,看错了,你使用的是Control的BeginInvoke方法,这个是没有回调的,如果可以通过换用Delegate的BeginInvoke来是可以的,也可以考虑使用返回类型IAsyncResult的IsCompleted 来判断
      

  7.   

    Delegate的BeginInvoke,关键要操作当前窗体的控件,实在是太麻烦了——提示非本线程创建的控件的~~
      

  8.   

    设计一个class,来包装你的AfterDownLoad方法需要的参数,同时包含一个delegate的字段,用来设置你的回调方法在AfterDownLoad方法里,执行到最后的地方判断调用参数对象实例里的delegate的字段不为null就调用来执行回调方法
      

  9.   

    当然可以直接把这个delegate设计为AfterDownLoad方法的参数,那就不需要再设计新的class了
      

  10.   

    看看下面的代碼是否合乎要求?Imports System.Threading
    Public Class Form1    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim t As Thread = New Thread(AddressOf Task)
            t.Start()
            B()
        End Sub    Delegate Sub BCallBack()    Private Sub Task()
            Dim ar As IAsyncResult = Me.BeginInvoke(New BCallBack(AddressOf A))
            Me.EndInvoke(ar)
            '不知道你的C是否要訪問控件,這裡假設不訪問
            C()
        End Sub    Private Sub A()
            MsgBox("A開始")
            Thread.Sleep(2000)
            MsgBox("A完成")
        End Sub    Private Sub B()
            MsgBox("B開始")
            Thread.Sleep(2000)
            MsgBox("B完成")
        End Sub    Private Sub C()
            MsgBox("C執行")
        End SubEnd Class
    執行時,C和B是同時執行的,互不干擾,因為他們在不同的線程。
    如果C也要在主線程,那么也不會干擾,因為主線程同時衹會做一件事
      

  11.   

    執行的順序是
    A先執行,等到A完成後B和C同時執行
      

  12.   

    上面的代碼,也的時候有可能會是B比A先執行
    執行順序為
    B-->A-->C,一個完成再執行下一個