c#基础知识篇-检测委托线程结束的三种方式
死循环while方式(不推荐)
Func<int, int, string> funE = TestE; IAsyncResult resultE_01 = funE.BeginInvoke(2, 2, null, null); while (!resultE_01.IsCompleted) { } string valueE_01 = funE.EndInvoke(resultE_01); Console.WriteLine("委托线程执行结束,获取到的返回值为:" + valueE_01);
Console.WriteLine("主线程结束,当前主线程ID:" + Thread.CurrentThread.ManagedThreadId);
使用句柄等待线程结束
设置超时时间,规定时间内是否能执行完线程,若能返回true,否则返回false。
IAsyncResult resultE_02 = funE.BeginInvoke(2, 2, null, null); bool isEnd = resultE_02.AsyncWaitHandle.WaitOne(2000); if (isEnd) { string valueE_02 = funE.EndInvoke(resultE_02); Console.WriteLine("委托线程规定时间内执行结束,获取到的返回值为:" + valueE_02); } else { Console.WriteLine("委托线程规定时间内未执行结束"); }
Console.WriteLine("主线程结束,当前主线程ID:" + Thread.CurrentThread.ManagedThreadId);
异步回调检测线程结束
BeginInvoke的倒数第二个参数是一个委托类型的参数,表示回调函数,用于传递委托,供线程结束时调用,回调函数即此委托所指向的方法。
BeginInvoke的倒数第一个参数用来给回调函数传递参数,调用OnCallBack时,会把IAsyncResult ar传递到OnCallBack中。
IAsyncResult resultE_04 = funE.BeginInvoke(2, 2, OnCallBack, funE); Console.WriteLine("主线程结束,当前主线程ID:" + Thread.CurrentThread.ManagedThreadId); static void OnCallBack(IAsyncResult arr) { Func<int, int, string> funE = arr.AsyncState as Func<int, int, string>; string value = funE.EndInvoke(arr); Console.WriteLine("委托线程执行结束,获取到的返回值为:" + value); }
简写形式:lambda表达式
IAsyncResult resultE_03 = funE.BeginInvoke(2, 2, a => { string valueE_03 = funE.EndInvoke(a); Console.WriteLine("委托线程执行结束,获取到的返回值为:" + valueE_03); }, null);
Console.WriteLine("主线程结束,当前主线程ID:" + Thread.CurrentThread.ManagedThreadId);
人生如逆旅
我亦是行人

浙公网安备 33010602011771号