* 1.委托创建线程步骤
* 1.创建一个委托对象,绑定函数
* 2.调用委托对象的BeginInvoke(null,null)函数,有参数的话放到两个null前面
* 3.委托对象调用BeginInvoke(null,null)返回值是一个IAsyncResult类型 用开记录线程的状态
* 4.IAsyncResult IsCompleted函数用来判断指向的线程是否已经结束
* 5.委托对象的 EndInvoke(IAsyncResult) 用来结束线程,获得线程的返回值 参数为指向该线程的状态类型
*/
class Program
{
static int Test(int i)
{
Console.WriteLine("Test");
Thread.Sleep(100); //休眠
return 100;
}
static void Main(string[] args) //
{
//1.通过委托开启线程
Func<int,int> a = Test;//创建委托
IAsyncResult ar = a.BeginInvoke(100,null, null);//开启一个新的线程去执行,a所引用的方法 在两个Null前加上参数
//IAsyncResult 取得当前线程的状态
Console.WriteLine("Main");
//1.检测线程是否执行结束,并获得返回值,
//第一种方法
while (ar.IsCompleted == false) //如果当前线没有实行完毕{
Console.WriteLine(".");
}
int res = a.EndInvoke(ar); //取得异步线程的返回值
Console.WriteLine(res);
Console.ReadKey();
//第二种
Func<int, int> a = Test;
//倒数第二个参数是一个委托类型的参数,当线程结束的时候会调用这个委托指向的方法
//倒数第一个参数是给回调函数传递参数
//C# 的lambda (参数序列) =>{ } 参数个数为1的话 不用加括号也可以
a.BeginInvoke(100, ar => {
int res = a.EndInvoke(ar);
Console.WriteLine(res + "在Lambda表达式中获得函数返回值");
}, null);
//第三种
//1000毫秒表示超时时间,如果1000没有结束,就返回false,如果结束返回True
bool isEnd = ar.AsyncWaitHandle.WaitOne(1000);
int res = a.EndInvoke(ar);
}