在 .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