C# 线程的异步

   class Program
    {
        public delegate int TakesAwhiledelegate(int data, int ms);

        static int TakesAwhile(int data, int ms)
        {
            Console.WriteLine("TakeStart");
            Thread.Sleep(ms);
            Console.WriteLine("Completed");
            return ++data;
        }
        static void Main(string[] args)
        {
            showcallback();
        }

        #region 异步委托
        /// <summary>
        /// 异步委托
        /// </summary>
        static void Show()
        {
            TakesAwhiledelegate dl = TakesAwhile;
            IAsyncResult ar = dl.BeginInvoke(1, 2000, null, null);
            if (!ar.IsCompleted)
            {
                Console.Write(".");
                Thread.Sleep(50);

            }

            int result = dl.EndInvoke(ar);
            Console.WriteLine(result);
            Console.Read();
        }
        #endregion
        #region 等待句柄
        /// <summary>
        /// 等待句柄
        /// </summary>
        static void showwait()
        {
            TakesAwhiledelegate dl = TakesAwhile;
            IAsyncResult aw = dl.BeginInvoke(1, 3000, null, null);
            while (true)
            {
                Console.WriteLine(".");
                if (aw.AsyncWaitHandle.WaitOne(50, false))
                {
                    Console.WriteLine(" can no wait for Results!");
                    break;
                }
            }
            int result = dl.EndInvoke(aw);
            Console.WriteLine("Result:{0}", result);
            Console.Read();
        }
       
        #endregion
        #region  异步回调
        #region 普通实现
        //异步回调
        static void showcallback()
        {
            TakesAwhiledelegate dl = TakesAwhile;
            dl.BeginInvoke(1, 3000, TakeAwhileCompleted, dl);
            for (int i = 0; i < 100; i++)
            {
                Console.Write(".");
                Thread.Sleep(50);
            }
            Console.Read();
        }
        //这个方法从委托线程中调用 而不是从主线程中调用
        static void TakeAwhileCompleted(IAsyncResult ar)
        {
            if (ar == null) throw new ArgumentNullException("ar");
            TakesAwhiledelegate dl = ar.AsyncState as TakesAwhiledelegate;
            Trace.Assert(dl != null, "Invalid object type");

            int result = dl.EndInvoke(ar);
            Console.WriteLine("Result:{0}", result);
            Console.ReadLine();
        }
        #endregion

        #region  Lambda实现
        static void showLambda()
        {
            TakesAwhiledelegate dl = TakesAwhile;
            dl.BeginInvoke(1, 3000, ar => {
                int result = dl.EndInvoke(ar);
                Console.WriteLine("Result:", result);
           
            }, null);
            for (int i = 0; i < 100; i++)
            {
                Console.Write(".");
                Thread.Sleep(50);
            }
        }
        #endregion

        #endregion
    }

代码来自书上。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值