创建线程之异步委托

首先定义一个runtaketime委托:

public delegate int runtaketime(int data,int ms);

定义一个静态的方法,参数,返回类型和定义的委托一样
static public int taketime(int data, int ms)
{
Console.WriteLine("time begin!");
Thread.Sleep(ms);
Console.WriteLine("time end!");
return data++;
}

1.投票,检查委托是否完成了它的任务

main()函数代码:
runtaketime a = new runtaketime(taketime);//把taketime方法加载到委托中
IAsyncResult ar = a.BeginInvoke(2, 3000, null, null);//异步调用该委托中的方法,返回IAsyncResult

//while循环和委托中的方法一块执行,但是end方法后面的代码必须等到委托中方法执行完毕才可以执行
while (!ar.IsCompleted)//判断委托是否完成了任务
{
Thread.Sleep(50);
Console.Write(".");
}
int result = a.EndInvoke(ar);//endinvoke()方法的返回值与其同步副本(委托中的方法)的返回值相同,参数为IAsyncResult

Console.WriteLine("result:{0}",result);

2.等待句柄,另一种等待异步委托执行的方式是使用与IasyncResult相关联的句柄

main()函数代码:

runtaketime a = new runtaketime(taketime);//把taketime方法加载到委托中
IAsyncResult ar = a.BeginInvoke(2, 3000, null, null);//异步调用该委托中的方法,返回IAsyncResult

//IasyncWaitHandle属性可以访问等待句柄,他返回一个WaitHandle对象,可以等待委托线程完成其任务
//WaitOne()方法中的参数为要等待的最长时间,如果超时则返回false,循环继续执行
while (!ar.AsyncWaitHandle.WaitOne(50))
{
 Console.Write(".");
 Thread.Sleep(50);
}

int result = a.EndInvoke(ar);//endinvoke方法的返回值与其同步副本(委托中的方法)的返回值相同,参数为IAsyncResult
Console.WriteLine("result:{0}",result);

3.异步回调是等待委托的结果的第三种方式

main()函数代码:

runtaketime a = new runtaketime(taketime);//把taketime方法加载到委托中
IAsyncResult ar = a.BeginInvoke(2, 3000, runtimecallback, a);//只要runtaketime委托完成任务,就会调用runtimecallback方法,参数a向异步操作完成时调用的方法传递特定的状态信息,即参数IAsyncResult ar
//在委托线程没有完成之前,不能结束主线程
for (int i = 0; i < 100; i++)
{
Thread.Sleep(50);
Console.Write(".");
}

runtimecallback()方法:

static void runtimecallback(IAsyncResult ar)
{
runtaketime a = ar.AsyncState as runtaketime;//把ar.AsyncState转换为runtaketime类型
Trace.Assert(a != null, "someting wrong!");//检查条件;如果条件为 false,则输出指定消息,并显示一个消息框,其中会显示调用堆栈。
int result = a.EndInvoke(ar);
Console.WriteLine("result:{0}", result);
}

原文地址:https://www.cnblogs.com/runninglzw/p/3842480.html