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);

 

posted @ 2023-06-30 00:14  相遇就是有缘  阅读(65)  评论(0)    收藏  举报