zoukankan      html  css  js  c++  java
  • 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=>操作)

    总结:

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

    EndInvoke方法来获得返回值

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

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

    异步回调方法,界面不卡

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

  • 相关阅读:
    Chapter 12 homework
    copy construction note
    Chapter 11 homework
    数组排序最大元素
    temporary Object and destructor
    strcpy() 函数注意的地方
    结对项目第二次作业
    结队项目——第一次作业
    软件工程实践2017第二次作业
    软件工程实践2017第一次作业
  • 原文地址:https://www.cnblogs.com/swobble/p/7079818.html
Copyright © 2011-2022 走看看