异步 是通过委托来实现的
异步就是另开一个线程 去执行委托里面的方法体
整个代码全部一下子贴出来
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参数传递到回调函数中