C#中的异步委托
来源:互联网 发布:淘宝联盟不能注册账号 编辑:程序博客网 时间:2024/05/17 08:58
异步委托
默认情况下,执行一个委托实例操作是同步的,但委托实例同样可以使用成员函数BeginInvoke()
进行异步回调。
BeginInvoke()
除了接收原有委托签名的参数之外,参数表尾部额外带有两个参数,分别为AsyncCallback
委托类型和object
类型。AsyncCallback
委托在回调委托运行结束之后触发,AsyncCallback
委托接收一个IAsyncResult
类型的参数。object
类型用于传递一些参数给AsyncCallback
委托。BeginInvoke()
的最后两个参数可以为null
。BeginInvoke()
返回IAsyncResult
类型:- 使用
IAsyncResult.IsCompleted
属性可以判断回调委托的执行状态。 - 使用
IAsyncResult.AsyncState
属性获取BeginInvoke()
参数表中的最后一个object
类型的传入参数。
- 使用
使用EndInvoke()
等待异步委托返回
如果需要等待异步执行的委托结束,可以使用
EndInvoke()
成员函数。
EndInvoke()
接受一个IAsyncResult
类型的参数(即BeginInvoke()
的返回值)。EndInvoke()
的返回值即为异步委托的返回值。- 在异步委托执行完毕之前,
EndInvoke()
会一直阻塞当前线程,直到异步委托结束。如下代码所示:
“`csharp
using System;
using System.Threading;delegate int Delegate();
class Program
{
static void Main(string[] args)
{
//用于回调的委托
Delegate del = () =>
{
Thread.Sleep(1000);
Console.WriteLine(“Thread is running!”);
return 100;
};//使用BeginInvoke()进行异步委托回调 IAsyncResult result = del.BeginInvoke(ar => { //异步委托结束时执行该Lambda,打印传入参数 Console.WriteLine("The object arg is: {0}", (int)ar.AsyncState); }, 200); Console.WriteLine("Program start..."); Console.WriteLine("The return value is: {0}", del.EndInvoke(result)); //使用IAsyncResult.IsCompleted属性判断委托是否执行完毕 Console.WriteLine("The thread status is: {0}", result.IsCompleted); }
}
“`运行结果:
Program start...
Thread is running!
The return value is: 100
The thread status is: True
The object arg is: 200
委托实例
del
虽然先被调用,但由于是异步调用,Sleep()
了1000毫秒之后再输出的字符位于主线程之后。
使用WaitOne()
等待异步委托返回
BeginInvoke()
的返回值IAsyncResult
类型的AsyncWaitHandle
属性会返回一个WaitHandle
类型的等待句柄:
- 该句柄的成员方法WaitHandle.WaitOne()
接受int
型参数作为超时时间,使用此方法可以实现等待指定时间(单位为毫秒)的效果。
-WaitHandle.WaitOne()
的返回值为bool
类型,用于表示异步委托是否结束。如下代码所示:
“`csharp
using System;
using System.Threading;delegate int Delegate();
class Program
{
static void Main(string[] args)
{
//用于回调的委托
Delegate del = () =>
{
Thread.Sleep(1000);
Console.WriteLine(“Thread is running!”);
return 100;
};//使用BeginInvoke()进行异步委托回调 IAsyncResult result = del.BeginInvoke(ar => Console.WriteLine("The object arg is: {0}", (int)ar.AsyncState), 200); Console.WriteLine("Program start..."); if (result.AsyncWaitHandle.WaitOne(1000)) Console.WriteLine("The return value is: {0}", del.EndInvoke(result)); //使用IAsyncResult.IsCompleted属性判断委托是否执行完毕 Console.WriteLine("The thread status is: {0}", result.IsCompleted); }
}
“`执行结果:
Program start...
The thread status is: False
可以看到,超时时间设为1000毫秒,此时异步委托尚未执行完毕,因而
IAsyncResult.IsCompleted
属性为false
。
- C#中的异步委托
- C#异步委托
- c#委托异步实现
- C#异步委托
- C#委托异步
- c#使用异步委托
- C# 委托异步
- C# 异步委托使用
- c#异步委托委托的使用
- C#委托的异步使用
- C#异步委托的用法
- C#委托异步调用简介
- C#委托的异步使用
- C#委托的异步调用
- C#委托的异步调用
- C#异步委托的使用
- C#委托的异步调用
- c#委托的异步调用
- 二叉树三种遍历方式
- 【t067】补充装备
- 机器学习算法——极限学习机(ELM)
- vi/vim 格式化代码段
- ApplicationContextAware
- C#中的异步委托
- x86汇编指令详解
- linux下程序的优先级
- kafka 的入门使用
- Android 实时视频采集/编码/传输/解码/播放—方案调研
- eclipse彻底修改工程名字
- Android开发笔记(一百一十五)设计工具
- Struts2模型驱动
- C语言的除法运算:整除/和求余%