30350303513035230353303543035530356303573035830359303603036130362303633036430365 30366303673036830369303703037130372303733037430375303763037730378303793038030381 30382303833038430385303863038730388303893039030391303923039330394303953039630397 3039830399304003040130402Calling returnGreetingDelegate.EndInvoke returnGreetingDelegate.EndInvoke returned: Hi there Bill, you are using .NET Rem oting Fire event that greetingCallBack is complete 30403304043040530406304073040830409304103041130412304133041430415304163041730418 30419304203042130422304233042430425304263042730428304293043030431304323043330434 30435304363043730438304393044030441304423044330444304453044630447304483044930450 30451304523045330454304553045630457304583045930460304613046230463304643046530466 30467304683046930470304713047230473304743047530476304773047830479304803048130482
当我们声明一个委托的时候,例如: public delegate bool FactorizingAsyncDelegate( int factorizableNum, ref int primefactor1, ref int primefactor2);系统是这样解释的:public class FactorizingAsyncDelegate : delegate { public bool Invoke( int factorizableNum, ref int primefactor1, ref int primefactor2); // The following code was supplied by the compiler. public IAsyncResult BeginInvoke( int factorizableNum, ref int primefactor1, ref int primefactor2, AsyncCallback cb, Object AsyncState ); // The following code was supplied by the compiler. public bool EndInvoke( ref int primefactor1, ref int primefactor2, IAsyncResult ar); }可以理解为这段代码是系统自己生成的这里的Invoke方法是同步调用,但它与函数的直接调用不同,Invoke调用时底层其实是Send一个Message出去,由这个Message的处理方开线程执行对应的方法,执行完后返回一个成功还是失败的值给send方,也就是调用方。在这个Message等待处理时,有一个时间差,这是与直接调用不同的,直接调用是由一个线程直接执行那个function。而所谓的BeginInvoke其实底层是Post一个Message,它post出去后自己继续做,不用等待Message的回应,由Message的处理方开线程执行对应的方法,也就是异步执行。当执行完了,那边会再Post一个message回来,由你这个所谓的主线程调用你这里的filewriteback。所以上面的那个filewriteback只会在BeginWrite执行完后才执行,不会出错。
但还是不太明白 :)
同时执行?那么如果a1线程的写入工作没做完,a2线程执行的filewriteback方法将被阻塞么?是这样么?谢谢了,我一直想搞清楚这个问题 :)
30366303673036830369303703037130372303733037430375303763037730378303793038030381
30382303833038430385303863038730388303893039030391303923039330394303953039630397
3039830399304003040130402Calling returnGreetingDelegate.EndInvoke
returnGreetingDelegate.EndInvoke returned: Hi there Bill, you are using .NET Rem
oting
Fire event that greetingCallBack is complete
30403304043040530406304073040830409304103041130412304133041430415304163041730418
30419304203042130422304233042430425304263042730428304293043030431304323043330434
30435304363043730438304393044030441304423044330444304453044630447304483044930450
30451304523045330454304553045630457304583045930460304613046230463304643046530466
30467304683046930470304713047230473304743047530476304773047830479304803048130482
我上面测试数据是开始异步调用后,在主线程循环写数,你可以看到,异步调用回调函数所写的字符写在我主线程循环数的中间。
public delegate bool FactorizingAsyncDelegate(
int factorizableNum,
ref int primefactor1,
ref int primefactor2);系统是这样解释的:public class FactorizingAsyncDelegate : delegate
{
public bool Invoke(
int factorizableNum,
ref int primefactor1,
ref int primefactor2); // The following code was supplied by the compiler.
public IAsyncResult BeginInvoke(
int factorizableNum,
ref int primefactor1,
ref int primefactor2,
AsyncCallback cb,
Object AsyncState
); // The following code was supplied by the compiler.
public bool EndInvoke(
ref int primefactor1,
ref int primefactor2,
IAsyncResult ar);
}可以理解为这段代码是系统自己生成的这里的Invoke方法是同步调用,但它与函数的直接调用不同,Invoke调用时底层其实是Send一个Message出去,由这个Message的处理方开线程执行对应的方法,执行完后返回一个成功还是失败的值给send方,也就是调用方。在这个Message等待处理时,有一个时间差,这是与直接调用不同的,直接调用是由一个线程直接执行那个function。而所谓的BeginInvoke其实底层是Post一个Message,它post出去后自己继续做,不用等待Message的回应,由Message的处理方开线程执行对应的方法,也就是异步执行。当执行完了,那边会再Post一个message回来,由你这个所谓的主线程调用你这里的filewriteback。所以上面的那个filewriteback只会在BeginWrite执行完后才执行,不会出错。