C#中的异步委托

来源:互联网 发布:淘宝联盟不能注册账号 编辑:程序博客网 时间:2024/05/17 08:58

异步委托

默认情况下,执行一个委托实例操作是同步的,但委托实例同样可以使用成员函数BeginInvoke()进行异步回调。

  • BeginInvoke()除了接收原有委托签名的参数之外,参数表尾部额外带有两个参数,分别为AsyncCallback委托类型和object类型。
  • AsyncCallback委托在回调委托运行结束之后触发,AsyncCallback委托接收一个IAsyncResult类型的参数。
  • object类型用于传递一些参数给AsyncCallback委托。
  • BeginInvoke()的最后两个参数可以为null
  • BeginInvoke()返回IAsyncResult类型:
    1. 使用IAsyncResult.IsCompleted属性可以判断回调委托的执行状态。
    2. 使用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

0 0
原创粉丝点击