不是的,你可以理解是生成了一个新的线程执行file.BeginWrite函数,但不是等这个线程结束后再执行filewriteback回调函数,而是这两个线程同时在执行。明白吗?

解决方案 »

  1.   

    谢谢你lanbaibai(蓝白白)
    但还是不太明白 :)
    同时执行?那么如果a1线程的写入工作没做完,a2线程执行的filewriteback方法将被阻塞么?是这样么?谢谢了,我一直想搞清楚这个问题 :)
      

  2.   

    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
      

  3.   

    当进程执行到mehtod的file.BeginWrite..这句时,是不是生成了一个新的线程(比如:a1线程)来执行file.BeginWrite函数,当这个线程结束后,再生成另一个新线程(比如:a2线程)来执行 filewriteback回调函数,两个线程不是同一个吧?不是这样的,只是生成了一个新线程,再加上主线程,所以,这时是两个线程(不是你理解的三个线程)
    我上面测试数据是开始异步调用后,在主线程循环写数,你可以看到,异步调用回调函数所写的字符写在我主线程循环数的中间。
      

  4.   

    当我们声明一个委托的时候,例如:
    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执行完后才执行,不会出错。