• 异步编程Demo


    1.问题

    static int TakesAWhile(int data, int ms)
    {
        Console.WriteLine("TakesAWhile started");
        Thread.Sleep(ms);
        Console.WriteLine("TakesAWhile completed");
        return ++data;
    }
    
    public delegate int TakesAWhileDelegate(int data, int ms);

    委托可以直接异步进行(BeginInvoke),而不用再开线程(Thread),实质是一样的

    直接执行委托

    TakesAWhile(1, 3000);

    第一次异步执行

    IAsyncResult ar = d1.BeginInvoke(1, 3000, null, null);
    while (!ar.IsCompleted)
    {
        // doing something else
        Console.Write(".");
        Thread.Sleep(50);
    }
    Console.WriteLine(d1.EndInvoke(ar));

    IsCompleted属性用于判断异步是否执行完毕.

    这里用一个while语句语句判断委托是否执行完毕.
    虽然委托执行的方法是异步的,但问题是无法知道什么时候执行完毕,却当委托有返回值时,还需要执行EndInvoke来获取返回值,还不是彻底的异步.
    只有在BeginInvoke执行完毕后才能获取到EndInvoke的返回值,否则就失去了异步的效果,所以需要判断IsCompleted以阻止执行EndInvoke

    使用WaitHandle

    // wait handle
     IAsyncResult ar = d1.BeginInvoke(1, 3000, null, null);
     while (true)
     {
         Console.Write(".");
         if (ar.AsyncWaitHandle.WaitOne())
         {
             Console.WriteLine("Can get the result now");
             break;
         }
     }
     int result = d1.EndInvoke(ar);
     Console.WriteLine("result: {0}", result);

    使用后的效果同上,无法真正意义上的解决问题.如果内部提供一个callback的方法就好了。

    使用异步回调

    这是真正解决问题的方法

    d1.BeginInvoke(1, 3000, TakesAWhileCompleted, d1);
    static void TakesAWhileCompleted(IAsyncResult ar)
    {
        if (ar == null) throw new ArgumentNullException("ar");
    
        TakesAWhileDelegate d1 = ar.AsyncState as TakesAWhileDelegate;
        Trace.Assert(d1 != null, "Invalid object type");
    
        int result = d1.EndInvoke(ar);
        Console.WriteLine("result: {0}", result);
    }

    第3个参数为异步委托,第4个执行的对象.

    更方便的执行匿名委托

    d1.BeginInvoke(1, 3000,
       ar =>
       {
           int result = d1.EndInvoke(ar);
           Console.WriteLine("result: {0}", result);
       },
       null);

    只方便记忆

  • 相关阅读:
    项目经理手记
    自动填写版权信息
    在批处理中实现等待/延迟/暂停
    使用 PowerDesigner 设计数据库
    如何让PowerDesigner支持自动生成含SQL Server 2000的表和列注释的角本
    管理人员的招聘始末谈
    PowerDesign 6简易介绍
    PowerDesigner11.0使用总结
    用表单字段加亮的方式为用户提供友好的界面
    择才有道——企业招聘方式比较
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1912179.html
Copyright © 2020-2023  润新知