使用委托的BeginInvoke和EndInvoke操作线程的步骤:
1.实例化委托
static CalculateMethod calculateMethod = new CalculateMethod(CalutateTwo); static PrintMethod printM = new PrintMethod(Print);
static PrintMethod printM = new PrintMethod(Print);
2.调用委托的BeginInvoke方法 BeginInvoke(委托需要的参数,回调方法(可为null),传递的对象(可为null))
方法执行完后会返回 IAsyncResult 类型的结果
IAsyncResult asyResult = printM.BeginInvoke("直接调用EndInvoke获取返回值 ", null, null);
如果不调用EndInvoke方法,程序会立即退出,这是由于使用BeginInvoke创建的线程都是后台线程,这种线程一但所有的前台线程
都退出后(其中主线程就是一个前台线程),不管后台线程是否执行完毕,都会结束线程,并退出程序。
3.使用EndInvoke方法接收返回的结果
(1)直接使用EndInvoke方法获取返回值
string result = printM.EndInvoke(asyResult);
(2)使用IAsyncResult asyncResult属性来判断异步调用是否完成当后台线程工作量巨大的时候,调用完BeginInvoke方法后,用户要等待很久才会有反馈,会影响用户交互体验,这时我们可以用
asyncResult来判断异步调用是否结束,并显示一些提示信息,增加用户体验。
//模拟线程调用时间过长,手动设置线程阻塞2s
Thread.Sleep(2000);
IAsyncResult Iresult = printM.BeginInvoke("直接调用EndInvoke获取返回值 ", PrintCallBack, null);
//IsCompleted 线程执行完毕时,IsCompleted为true
while (!Iresult.IsCompleted)
{
Console.Write("*");
Thread.Sleep(1000);
}
string result = printM.EndInvoke(Iresult);
Console.WriteLine(result);
(3)使用回调方法返回结果
//PrintCallBack为回调函数,当线程执行完后会调用这个函数,可以在这个函数中接收返回的结果
printM.BeginInvoke("直接调用EndInvoke获取返回值 ", PrintCallBack, null);
static void PrintCallBack(IAsyncResult Result)
{
Console.WriteLine(printM.EndInvoke(Result));
}