zoukankan      html  css  js  c++  java
  • C#中委托实现的异步编程

    所谓同步:如果在代码中调用了一个方法,则必须等待该方法所有的代码执行完毕之后,才能回到原来的地方执行下一行代码。

    异步:如果不等待调用的方法执行完,就执行下一行代码。

    1.0 同步例子:

     1 class Program
     2     {
     3         private static int Calculate(int a, int b)
     4         {
     5             Console.WriteLine("1.开始计算!");
     6 
     7             System.Threading.Thread.Sleep(1000 * 3);//假如计算需要3秒钟
     8 
     9             int c = a + b;
    10 
    11             Console.WriteLine("2.计算完成,结果:{0}+{1}={2}", a, b, c);
    12 
    13             return c;
    14         }
    15 
    16         static void Main(string[] args)
    17         {
    18             Console.WriteLine("---------程序运行开始----------");
    19 
    20             Calculate(1, 2);
    21 
    22             Console.WriteLine("---------程序运行结束----------");
    23 
    24             Console.ReadKey();
    25         }
    26     }

    1.1 运行结果:

    2.0 改用异步调用

     1 static void Main(string[] args)
     2         {
     3             Console.WriteLine("-----------程序运行开始----------");
     4 
     5             Func<int, int, int> action = Calculate;//声明一个委托
     6 
     7             IAsyncResult ret = action.BeginInvoke(1, 2, null, null);
     8 
     9             Console.WriteLine("1.我不参与计算,先走了啊!");
    10 
    11             int amount = action.EndInvoke(ret);
    12 
    13             Console.WriteLine("-----------程序运行结束----------");
    14 
    15             Console.ReadKey();
    16         }

    2.1 运行结果:

    2.2 为了提高程序的使用体验,我们可以再计算的时候,每隔一秒钟,打印一个点“.”。整体代码改成如下:

     1 private static int Calculate(int a, int b)
     2         {
     3             System.Threading.Thread.Sleep(1000 * 10);//假如计算需要3秒钟
     4 
     5             int c = a + b;
     6 
     7             Console.WriteLine("
    计算完成,结果:{0}+{1}={2}", a, b, c);
     8 
     9             return c;
    10         }
    11 
    12         static void Main(string[] args)
    13         {
    14             Console.WriteLine("-----------程序运行开始----------");
    15 
    16             Func<int, int, int> action = Calculate;//声明一个委托
    17 
    18             IAsyncResult ret = action.BeginInvoke(1, 2, null, null);
    19 
    20             Console.WriteLine("我不参与计算,先走了啊!");
    21 
    22             Console.WriteLine("正在努力计算:");
    23             while (ret.IsCompleted == false)
    24             {
    25                 Console.Write(".");
    26                 System.Threading.Thread.Sleep(1000);
    27             }
    28 
    29             int amount = action.EndInvoke(ret);
    30 
    31             Console.WriteLine("-----------程序运行结束----------");
    32 
    33             Console.ReadKey();
    34         }

    2.3 运行结果:

     3.0 异步回调。以上方式还没有体现异步编程的效果,因为整个计算过程都是在“程序运行开始”和”程序运行结束“之间的。所以还有另外一种实现方式,整体代码改成如下:

     1 private static int Calculate(int a, int b)
     2         {
     3             System.Threading.Thread.Sleep(1000 * 3);//假如计算需要3秒钟
     4 
     5             int c = a + b;
     6 
     7             return c;
     8         }
     9 
    10         static Func<int, int, int> func = Calculate;//声明一个委托
    11 
    12         static void Main(string[] args)
    13         {
    14             Console.WriteLine("-----------程序运行开始----------");
    15 
    16 
    17             IAsyncResult ret = func.BeginInvoke(1, 2, ShowFolderSize,"");
    18 
    19             Console.WriteLine("计算开始:");
    20 
    21             Console.WriteLine("-----------程序运行结束----------");
    22 
    23             Console.ReadKey();
    24         }
    25 
    26         public static void ShowFolderSize(IAsyncResult result)
    27         {
    28             int c = func.EndInvoke(result);
    29             Console.WriteLine("计算完成,结果为:{0}",c);
    30         }

    3.1 运行结果:

     3.2 注意回调方法的返回值类型是void,只能有一个IAsyncResult类型的参数,并且要在方法体中调用EndInvoke来取回方法执行的结果,另外result参数的AsyncState属性包含了外界传入的参数信息。

  • 相关阅读:
    Java实现 LeetCode 382 链表随机节点
    Java实现 LeetCode 382 链表随机节点
    Java实现 LeetCode 381 O(1) 时间插入、删除和获取随机元素
    Java实现 LeetCode 381 O(1) 时间插入、删除和获取随机元素
    Java实现 LeetCode 381 O(1) 时间插入、删除和获取随机元素
    Java实现 LeetCode 380 常数时间插入、删除和获取随机元素
    Java实现 LeetCode 380 常数时间插入、删除和获取随机元素
    Linux下的iwpriv(iwlist、iwconfig)的简单应用
    OCX控件的注册卸载,以及判断是否注册
    .OCX、.dll文件注册命令Regsvr32的使用
  • 原文地址:https://www.cnblogs.com/renjing/p/Invoke.html
Copyright © 2011-2022 走看看