using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace 线程启动
{
    class Program
    {
        static int Test(int t,int b)
        {
            Console.WriteLine("test"+ t);
            Thread.Sleep(1000);//等待1000ms
            return 5520;
        }
        static void Main(string[] args)
        {
           // Action<int> ac = Test;//不带返回值
            Func<int,int,int> ac = Test;
            IAsyncResult iar = ac.BeginInvoke(100, null, null);//异步调用 
            Console.WriteLine("中华人民共和国");
           // 判断线程是否结束,循环方法 方法1=========================
            while (!iar.IsCompleted)//判断线程是否已经有返回值
            {
                Console.WriteLine("线程已经结束,返回值:" + ac.EndInvoke(iar));//输出返回值
            }
            //判断线程是否结束,回调方法 方法2==========================
            IAsyncResult iar = ac.BeginInvoke(100,OnCallBack, ac);//回调用方法,倒数第二个参数是回调的方法,倒数第一个传递值给回调方法
             Console.WriteLine("中华人民共和国");
            //判断线程是否结束,延时等待 方法3==========================
            bool isend = iar.asyncwaithandle.waitone(1000);//延时1000ms检查线程是否结束
            if (isend)//如果返回true说明线程已经结束读了返回结果,否则不读
            {
                console.writeline(ac.endinvoke(iar));
            }
            //lambda表达试取返回值=======================================
            ac.BeginInvoke(100,300,iar=> 
            {
                int a = ac.EndInvoke(iar);
                Console.WriteLine(a);
            },null);
            Console.ReadKey();
        }
        //以下是回调方法的具体实现:
        static void OnCallBack(IAsyncResult iar)
        {
            Func<int, int, string> a = iar.AsyncState as Func<int,int, string>;//会把返回结果 
            Console.WriteLine("线程已经结束!值="+a.EndInvoke(iar));//回调方法的运行结果
        }
 
    }
}

  

posted on 2022-06-08 16:40  sbwynnss  阅读(35)  评论(0编辑  收藏  举报