异步 等待异步 异步回调 获取异步结果

异步 是通过委托来实现的

异步就是另开一个线程 去执行委托里面的方法体


整个代码全部一下子贴出来

 Console.WriteLine("程序开始");

            Func<string,string> fun = t => {
                //等待2秒 容易看效果
                Thread.Sleep(2000);

                Console.WriteLine("{0}进入方法,线程ID{1}",t,Thread.CurrentThread.ManagedThreadId);                
                return DateTime.Now.ToString();
            };


            IAsyncResult iasyncResult=null;

            AsyncCallback asybak = t =>
            {
                //获取异步方法的返回值
                string result= fun.EndInvoke(iasyncResult);
                //休眠3秒
                Thread.Sleep(3000);
                //输出
                Console.WriteLine("参数值为:{0},返回结果为:{1},线程ID{2}", t.AsyncState, result, Thread.CurrentThread.ManagedThreadId);
            };

            fun.Invoke("直接调用");
            //异步调用
            iasyncResult = fun.BeginInvoke("异步调用",asybak, "传过去的参数");


            //等待异步 方法1
            while (!iasyncResult.IsCompleted)
            {
                Console.WriteLine("异步正在进行中");
                Thread.Sleep(500);
            }

            //等待异步 方法2
            //这种方法可以设置 在等待异步多少秒之后,如果异步还没有执行完 就不等了 继续往下执行
            //iasyncResult.AsyncWaitHandle.WaitOne(1000);
            //等待异步 方法3
            //注意 EndInvoke 只能存在一个,回调中 通过这里获取返回值了,这里就不能存在了
            //思路:可以在上面设置一个变量,在这里赋值  在回调里面用
            //fun.EndInvoke(iasyncResult);

            Console.WriteLine("程序执行结束");
看结果



可以从结果中 总结出以下几点

1、异步调用和普通调用 用的不是一个线程 异步是另申请了一个线程执行的

2、异步等待,等待的只是委托方法体里面的方法体,这里面的执行完了 就算等待完了,而并不是等待回调执行完

3、每种等待 都会阻塞当前代码执行

4、BeginInvoke中最后一个参数 可以作为AsyncState参数传递到回调函数中



  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值