创建线程之异步委托
2014-07-14 12:32
246 查看
首先定义一个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);
}
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);
}
相关文章推荐
- 【转】谈.Net委托与线程——创建无阻塞的异步调用
- C# 创建线程的简单方式:异步委托
- C# 创建线程的简单方式:异步委托 .
- 谈.Net委托与线程——创建无阻塞的异步调用
- C#构建多线程应用程序(1) —— 使用委托来自动创建次线程以实现异步方法的调用
- 用委托在listbox中异步显示信息,解决线程间操作无效,从不是创建控件的线程访问它
- 谈.Net委托与线程——创建无阻塞的异步调用
- 谈.Net委托与线程——创建无阻塞的异步调用
- WCF:如何创建带有异步访问委托的代理类
- (二)线程--通过委托异步调用方法
- 利用委托解决多线程中“不是此控件创建的线程”的问题
- 界面-工作者线程结构之:异步委托调用
- 谈.Net委托与线程——创建无阻塞的异步调用(一)
- 谈.Net委托与线程——创建无阻塞的异步调用(二)
- 谈.Net委托与线程——创建无阻塞的异步调用(一)
- 谈.Net委托与线程——创建无阻塞的异步调用(一)
- 谈.Net委托与线程——创建无阻塞的异步调用(二)
- 线程学习1——异步委托
- WCF:如何创建带有异步访问委托的代理类
- 线程学习1——异步委托