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

来源:互联网 发布:网络合作合同 编辑:程序博客网 时间:2024/04/28 12:36

异步 是通过委托来实现的

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


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

 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参数传递到回调函数中



0 0
原创粉丝点击