C# 异步编程

例子1:

    using System;  
          
     class Program  
        {  
            public delegate int CalculateDelegate(int min,int max);  
            static void Main(string[] args)  
            {  
                CalculateDelegate d = Calculate;  
                //为了简单,未检查输入是否数字  
                Console.WriteLine("请输入最小数字:");  
                int min = int.Parse(Console.ReadLine());  
                Console.WriteLine("请输入最大数字:");  
                int max = int.Parse(Console.ReadLine());  
                //public IAsyncResult BeginInvoke(  
                //  <输入和输出变量>,  
                //  AsyncCallback callback, object asyncState  
                //)  
                //第一部分是定义委托时确定的方法签名中的参数列表,没有参数时为空d.BeginInvoke(null, null);  
                //第二个参数callback是当异步调用结束时自动回调的函数  
                //第三个参数asyncState用于向第二个参数所确定的callback回调函数提供额外的信息  
                IAsyncResult ret = d.BeginInvoke(min, max, null, null);   
                Console.WriteLine("正在计算中,请耐心等待.....");  
                while (!ret.IsCompleted)  
                {  
                    Console.Write(".");  
                    System.Threading.Thread.Sleep(1000);  
                }  
               int count = d.EndInvoke(ret);  
               Console.WriteLine("/n计算完成。从{0}加到{1}的值为:{2}", min, max, count);  
                Console.ReadKey();  
            }  
            static int Calculate(int min,int max)  
            {  
                int count = 0;  
                for (int i = min; i < max; i++)  
                {  
                    count += i;  
                }  
                return count;  
            }  
        }  
例子2:

例子1使用轮询方法不断询问异步调用是否完成,会浪费不少CPU时间在循环等待上,可以让异步调用方法在结束时自动调用一个函数,并在这个函数中显示处理结果。

    using System;  
      class Program  
        {  
            public delegate int CalculateDelegate(int min, int max);  
            private static CalculateDelegate d = new CalculateDelegate(Calculate);  
            static void Main(string[] args)  
            {  
                Console.WriteLine("请输入最小数字:");  
                int min = int.Parse(Console.ReadLine());  
                Console.WriteLine("请输入最大数字:");  
                int max = int.Parse(Console.ReadLine());  
                //BeginInvoke()方法的第二个参数指定当异步调用结束时回调ShowMsg(),第三个参数传送给回调函数  
                IAsyncResult ret = d.BeginInvoke(min, max, ShowMsg, (min + "," + max));  
                Console.ReadKey();  
            }  
            static int Calculate(int min, int max)  
            {  
                int count = 0;  
                for (int i = min; i < max; i++)  
                {  
                    count += i;  
                }  
                return count;  
            }  
            static void ShowMsg(IAsyncResult result)  
            {  
                int count = d.EndInvoke(result);  
                string[] n = ((string)result.AsyncState).Split(',');  
                Console.WriteLine("从{0}加到{1}的和是{2}。", n[0], n[1], count);  
            }  
        }  
相关文章
相关标签/搜索