异步执行回调函数的参数是IAsyncResult,接收BeginInvoke方法返回结果
EndInvoke方法的参数,也有IAsyncResult,也能从BeginInvoke方法获取
而回调函数是异步调用的方法执行完成后,才执行
那不如就直接用EndInvoke方法来处理结果就行了啊请问:
回调函数是不是没啥用啊?是不是多余啊?

解决方案 »

  1.   

    Don’t call me I will call you!
      

  2.   

    楼主,关键的问题是,EndInvoke方法光有正确参数还是不行的,必须要在异步操作完成后调用才能成功,必须要在异步操作完成后才能调用EndInvoke方法,否则调用EndInvoke方法不会成功,即使你能取到EndInvoke方法的参数并传递给EndInvoke方法,如果异步操作没有完成,EndInvoke方法也不会成功,而调用完BeginInvoke方法后,如果没有回调函数你不知道异步操作何时结束,如果你就直接调用EndInvoke方法几乎肯定会失败,因为这时候异步操作大多没有完成,所以最可靠的实现方法就是在回调函数调用EndInvoke方法,这时候可以保证异步操作已经完成,
      

  3.   

    Don't call us, we'll call you
      

  4.   

    其实楼主也没有说错。
    说白了,无非就是在使用异步。而这个在线程池中的线程何时结束是我们所关心的!
    说回调函数没有用,也没有错,因为可以使用轮询的方式去看这个任务有没有完成,或者使用等待句柄的方式,等待这个线程的任务完成。而回调也是一种方式,只不过这个方式更加合理,在任务完成时,去主动调用你指定的方法。所以,Sandy945总结的非常好:Don't call us, we'll call you
      

  5.   

    呵呵,其实理由和楼上很多人说的那样,我用另外一种表达方式表达吧,回调函数被执行的时候,异步操作必定已经完成,所以回调函数调EndInvoke方法用必定能成功,因为回调函数不是你自己去调用的,而是.Net框架调用的,.Net会在异步操作完成的瞬间调用回调函数,所以回调函数被调用的时候,异步操作刚刚好完成,这就是回调函数的优势,它能够及时(没有任何延迟的)让你处理异步操作的结果,但又能保证EndInvoke方法能成功,而对于异步操作,你是无法准确知道异步操作何时完成,因为异步的意思就是方法不等到完成就立即返回,这样你就无法知道何时调用EndInvoke方法能确保成功,
      

  6.   

    如果你的后台线程需要等到该异步操作结束后才能继续进行,那么endinvoke就很重要了。比如异步操作是改变B窗口text控件的值,而后台操作需要等这个值改变结束,进行运算,那么endinvoke就可以作为继续运算的触发器。