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属性包含了外界传入的参数信息。

  • 相关阅读:
    前世今生:Hive、Shark、spark SQL
    spark streaming 6: BlockGenerator、RateLimiter
    spark streaming 5: InputDStream
    spark streaming 4: DStreamGraph JobScheduler
    常见css水平自适应布局
    js动态加载以及确定加载完成的代码
    如何判断css是否加载完成
    翻书特效
    jquery 事件冒泡的介绍以及如何阻止事件冒泡
    phonegap之android原生日历调用
  • 原文地址:https://www.cnblogs.com/renjing/p/Invoke.html
Copyright © 2011-2022 走看看