• 委托的异步


    1.委托的异步使用BeginInvoke,这样程序执行时不需要等待委托的函数执行完以后再执行下一句。

    但是委托的异步如果有返回值

    1
    2
    3
    4
    5
    private delegate void invokeDelegate();
    del = new invokeDelegate(StartMethod);
    var re=   del.BeginInvoke(null, null);
    MessageBox.Show( del.EndInvoke(re));
     MessageBox.Show("f");

    这个时候就会堵塞,等待StartMethod执行完才会走到第5句,没有体现出异步的功能。

    回调函数可以解决这个问题,可以将EndInvoke放在IAsyncCallback中执行,将3,4句改为

    1
    IAsyncResult ir = id.BeginInvoke(AddComplete, null);

     并添加以下函数:

    1
    2
    3
    4
    5
    prvite void AddComplete(IAsyncResult result)
    {
          invokeDelegate handler = (invokeDelegate)((AsyncResult)result).AsyncDelegate;
          MessageBox.Show( handler.EndInvoke(result));
     }

    这样就函数便不用等待委托执行完,可以先执行第5句。

    StartMethod方法如下:

    1
    2
    3
    4
    5
    private void StartMethod()
    {
         Thread.Sleep(5000);
        MessageBox.Show("c");
     }

    委托的BeginInvoke实际上是放在threadpool中的。

    2.control的invoke和BeginInvoke都是在主线程上的所以它们都会阻塞主线程(control所在线程)。beginInvoke不会阻塞支线程,所以它只能作为支线程的异步

  • 相关阅读:
    【2019-12-13】泛型
    【2019-12-12】函数
    【2019-12-10】类
    【2019-12-05】接口
    【2019-12-3】变量声明
    【2019-11-24】基础类型
    【2019-11-20】服务与DI简介
    【2019-11-20】组件简介
    android之ListView与Adapter(结合JavaBean)
    android基类Adapter
  • 原文地址:https://www.cnblogs.com/paidaxing/p/3804425.html
Copyright © 2020-2023  润新知