异步的实现即多线程,一种简单的方式就是创建一个委托,然后异步调用它。 .Net Framework已经为我们提供了委托的异步调用方法。下面介绍三种使用委托实现异步的方法。

 

1、投票(IsCompleted属性)

首先定义一个委托:

int ms);

Delegate类提供了BeginInvoke()方法,这个方法返回一个IAsyncResult接口,这个接口包含了该委托的相关信息,并且可以通过它的IsCompleted属性来判断该委托是否执行完成。下面是将要异步调用的方法:

int ms)
   2: {
);
   4:     Thread.Sleep(ms);
);
;
   7: }

下面是主线程的方法:

void Imp1()
   2: {
   3:     MyDelegate dl = DelegateMethod;
   4:  
null);
   6:  
while (!ar.IsCompleted)
   8:     {
);
  10:         Thread.Sleep(50);
  11:     }
string result = dl.EndInvoke(ar);
, result);
  14: }

可以看到,委托线程执行5秒钟,主线程不停的循环判断委托线程是否完成(用IsCompleted属性判断)。如果没完成则断续打点,如果完成则跳出循环。用EndInvoke方法获取委托的返回值。如果方法未执行完,EndInvoke方法就会一直阻塞,直到被调用的方法执行完毕。

 

2、等待句柄(AsyncWaitHandle属性)

使用IAsyncResult的AsyncWaitHandle属性可以访问等待句柄,这个属性返回一个WaitHandle对象,这个对象的WaitOne()方法可输入一个超时时间作为参数,设置等待的最长时间。如果超时,WaitOne()方法返回一个bool值,true为等待成功(即委托完成),异步调用的方法与上面一样,下面是主线程实现:

void Imp2()
   2: {
   3:     MyDelegate dl = DelegateMethod;
   4:  
null);
true)
   7:     {
);
if (ar.AsyncWaitHandle.WaitOne(50))
  10:         {
);
break;
  13:         }
  14:     }
string result = dl.EndInvoke(ar);
, result);
  17: }
主线程每等待50秒做一次判断是否完成。
 
3、异步回调(AsyncCallBack委托)
BeginInvoke方法第二个参数可传入一个AsnycCallBack委托类型的方法,当异步调用完成时会执行这个方法。我们可以用Lambda表达式来实现:
void Imp3()
   2: {
   3:     MyDelegate dl = DelegateMethod;
new AsyncCallback(ar =>
   5:     {
string result = dl.EndInvoke(ar);
, result);
null);
int i = 0; i < 100; i++)
  10:     {
);
  12:         Thread.Sleep(50);
  13:     }
  14: }
BeginInvoke方法的最后一个参数可以用IAsyncResult的AsyncState属性获取。
 
参考资料:《C#高级编程》
 
本文源代码:

 

1、投票(IsCompleted属性)

首先定义一个委托:

int ms);

Delegate类提供了BeginInvoke()方法,这个方法返回一个IAsyncResult接口,这个接口包含了该委托的相关信息,并且可以通过它的IsCompleted属性来判断该委托是否执行完成。下面是将要异步调用的方法:

int ms)
   2: {
);
   4:     Thread.Sleep(ms);
);
;
   7: }

下面是主线程的方法:

void Imp1()
   2: {
   3:     MyDelegate dl = DelegateMethod;
   4:  
null);
   6:  
while (!ar.IsCompleted)
   8:     {
);
  10:         Thread.Sleep(50);
  11:     }
string result = dl.EndInvoke(ar);
, result);
  14: }

可以看到,委托线程执行5秒钟,主线程不停的循环判断委托线程是否完成(用IsCompleted属性判断)。如果没完成则断续打点,如果完成则跳出循环。用EndInvoke方法获取委托的返回值。如果方法未执行完,EndInvoke方法就会一直阻塞,直到被调用的方法执行完毕。

 

2、等待句柄(AsyncWaitHandle属性)

使用IAsyncResult的AsyncWaitHandle属性可以访问等待句柄,这个属性返回一个WaitHandle对象,这个对象的WaitOne()方法可输入一个超时时间作为参数,设置等待的最长时间。如果超时,WaitOne()方法返回一个bool值,true为等待成功(即委托完成),异步调用的方法与上面一样,下面是主线程实现:

void Imp2()
   2: {
   3:     MyDelegate dl = DelegateMethod;
   4:  
null);
true)
   7:     {
);
if (ar.AsyncWaitHandle.WaitOne(50))
  10:         {
);
break;
  13:         }
  14:     }
string result = dl.EndInvoke(ar);
, result);
  17: }
主线程每等待50秒做一次判断是否完成。
 
3、异步回调(AsyncCallBack委托)
BeginInvoke方法第二个参数可传入一个AsnycCallBack委托类型的方法,当异步调用完成时会执行这个方法。我们可以用Lambda表达式来实现:
void Imp3()
   2: {
   3:     MyDelegate dl = DelegateMethod;
new AsyncCallback(ar =>
   5:     {
string result = dl.EndInvoke(ar);
, result);
null);
int i = 0; i < 100; i++)
  10:     {
);
  12:         Thread.Sleep(50);
  13:     }
  14: }
BeginInvoke方法的最后一个参数可以用IAsyncResult的AsyncState属性获取。
 
参考资料:《C#高级编程》
 
本文源代码:

相关文章:

  • 2021-09-23
  • 2022-12-23
  • 2022-03-02
  • 2018-09-25
  • 2021-09-08
  • 2021-09-01
  • 2022-12-23
  • 2021-08-07
猜你喜欢
  • 2021-05-19
  • 2022-12-23
  • 2022-01-06
  • 2021-12-02
  • 2022-03-08
  • 2022-12-23
相关资源
相似解决方案