6.26学习 异步委托回调函数 VS 多线程 VS 并行处理

描述:

我现在是轮询着构建实例,然后这个实例去执行一个方法,但是执行方法需要大约10s时间,全部轮询下来需要很长时间。所以我现在要更改,头给了我两个方法,1多线程 2异步委托回调函数。

异步委托回调函数:

C# 委托的三种调用示例(同步调用 异步调用 异步回调)

同步调用:Invoke方法用来进行同步调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行。

    AddHandler handler = new AddHandler(加法类.Add);
               int result = handler.Invoke(1, 2);

异步调用:不阻塞线程,把调用塞到线程池中,程序主线程或UI线程可以继续执行。委托的异步调用通过BeginInvoke和EndInvoke来实现。()

异步回调:用回调函数,当调用结束时会自动调用回调函数,解决了为等待调用结果,而让线程依旧被阻塞的局面

C#线程:BeginInvoke和EndInvoke方法

http://developer.51cto.com/art/200908/141587.htm

使用IAsyncResult asyncResult属性来判断异步调用是否完成

直接使用EndInvoke方法来获得返回值

使用WaitOne方法等待异步方法执行完成

上面介绍的几种方法实际上只相当于一种方法。这些方法虽然可以成功返回结果,也可以给用户一些提示,但在这个过程中,整个程序就象死了一样(如果读者在GUI程序中使用这些方法就会非常明显),要想在调用的过程中,程序仍然可以正常做其它的工作,就必须使用异步调用的方式

所以想invoke而主界面不卡则只能使用异步回调方法.

有关于并行处理的AsParallel方法

AsParallel,异步回调委托本质都是多线程。区别就是有没有线程池

new List<int>().AsParallel().ForAll(a=>操作)

6.26学习   异步委托回调函数 VS 多线程 VS 并行处理

总结:

IAsyncResult asyncResult属性来判断异步调用是否完成

EndInvoke方法来获得返回值

WaitOne方法等待异步方法执行完成

AsParallel,异步回调委托本质都是多线程。区别就是有没有线程池,AsParallel会充分利用多核CPU来实现真正意义上的并行处理

异步回调方法,界面不卡

6.26学习   异步委托回调函数 VS 多线程 VS 并行处理

GetTypeCompletedToCreatInstance 定义的AsyncCallback类型回调方法,参数全在IAsyncResult类型asyncResult里,可以自定义一个类,将你想要传给这个回调方法的参数全部写在这个类里,然后再(SingNetDevice)用括号前传该类,该类需要有委托类的属性才能获取委托的的值(endinvoke)

6.26学习   异步委托回调函数 VS 多线程 VS 并行处理

6.26学习   异步委托回调函数 VS 多线程 VS 并行处理

上一篇:c# “XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。


下一篇:C# OpenCVSharp使用SetMouseCallback设置回调方法,报错"向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。"