CLR 的异步调用的测试

本文探讨了在.NET中使用两种不同的方法来等待异步操作完成,包括使用while循环进行忙等待和利用AsyncWaitHandle的WaitOne方法。通过具体的代码示例和实验结果,展示了这两种方法在实际应用中的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

在 .net中要主线程的delegate begininvoke之后,等待工作线程返回可以

System.IAsyncResult ar

1while(!ar.IsCompleted){}

2ar.AsyncWaitHandle.WaitOne();

但是两种方法有本质不同,至少在我的机器上有相当不一样的表现,1是主线程忙等待2是主线程等着个信号就

撂摊了,为了验证这点我做了以下测试,代码和测试结果如下:

 

代码:

using System;

namespace Chapter6
{
 public delegate int simpleDelegate(int x,int y);

 //异步调用同步不按照顺序执行!
 public sealed class test
 {
  public static int add(int x,int y){ System.Threading.Thread.Sleep(1000);return x+y;  }

  public static int sub(int x,int y){ System.Threading.Thread.Sleep(1000);return x-y;     }

  public static void work()
  {
   //bind
   simpleDelegate s1 = new simpleDelegate(test.add);
   simpleDelegate s2 = new simpleDelegate(test.sub);

   //bind callback
   System.AsyncCallback asc = new AsyncCallback(test.complete);

   System.IAsyncResult ar1 = s1.BeginInvoke(10,20,asc,s1);
   System.IAsyncResult ar2 = s2.BeginInvoke(10,20,asc,s2);

   //用这种方式等待信号相当的不稳定还没有while(!ar.IsCompleted){} 来的好
   //居然返回的顺序以及次数是不定的
   //有可能是此函数实质作用是标示CLR系统的工作线程没有完成前不要退出?
   ar1.AsyncWaitHandle.WaitOne();
   ar2.AsyncWaitHandle.WaitOne();

   System.Console.WriteLine("Main thread ended up with bob'name {0}",bob.name);
  }

  public static void complete(System.IAsyncResult call)
  {
   simpleDelegate simple = (simpleDelegate)call.AsyncState;
   bob.name = simple.Method.Name +"er_workAtTime_" + System.DateTime.Now.Ticks.ToString();
   System.Console.WriteLine("called {0} :{1}",simple.Method.Name,simple.EndInvoke(call));

  }

  public static Bob bob = new Bob();
 }

 public class Bob
 {
  public string name ="";
  public int    age  = 0;
 }
  
}

 

 

执行work() 200次测试结果数据:

called add :30
Main thread ended up with bob'name adder_workAtTime_632770798027001824

called sub :-10
called add :30
Main thread ended up with bob'name adder_workAtTime_632770798042023424

called sub :-10
called add :30
Main thread ended up with bob'name adder_workAtTime_632770798052037824

called sub :-10
called add :30
Main thread ended up with bob'name adder_workAtTime_632770798062052224

called sub :-10
called add :30
Main thread ended up with bob'name adder_workAtTime_632770798072066624

called sub :-10
called add :30
Main thread ended up with bob'name adder_workAtTime_632770798081980880

called sub :-10
called add :30
Main thread ended up with bob'name adder_workAtTime_632770798092095424

called sub :-10
called add :30
called sub :-10
Main thread ended up with bob'name suber_workAtTime_632770798102109824

called add :30
Main thread ended up with bob'name adder_workAtTime_632770798112024080

called sub :-10
called sub :-10
Main thread ended up with bob'name suber_workAtTime_632770798122038480

called add :30
called add :30
Main thread ended up with bob'name adder_workAtTime_632770798132052880

called sub :-10
called add :30
Main thread ended up with bob'name adder_workAtTime_632770798142067280

called sub :-10
called add :30
called sub :-10
Main thread ended up with bob'name suber_workAtTime_632770798152081680

called add :30
Main thread ended up with bob'name adder_workAtTime_632770798162096080

called sub :-10
called add :30
called sub :-10
Main thread ended up with bob'name suber_workAtTime_632770798172110480

called add :30
Main thread ended up with bob'name adder_workAtTime_632770798182124880

called sub :-10
called add :30
Main thread ended up with bob'name adder_workAtTime_632770798192139280

called sub :-10
called add :30
Main thread ended up with bob'name adder_workAtTime_632770798202253824

called sub :-10
called add :30
called sub :-10
Main thread ended up with bob'name suber_workAtTime_632770798212268224

called add :30
Main thread ended up with bob'name adder_workAtTime_632770798222282624

called sub :-10
called add :30
called sub :-10
Main thread ended up with bob'name suber_workAtTime_632770798232297024

called add :30
called sub :-10
Main thread ended up with bob'name suber_workAtTime_632770798242311424

called add :30
Main thread ended up with bob'name adder_workAtTime_632770798252225680

called sub :-10
called add :30
Main thread ended up with bob'name adder_workAtTime_632770798262240080

called sub :-10
called add :30
Main thread ended up with bob'name adder_workAtTime_632770798272254480

called sub :-10

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值