异步编程和回调函数

gaoxingbugaoxing 2004-11-21 10:43:08
void method()
{
file.BeginWrite(....,new AsyncCallback(filewritecallback),..)
}

void filewriteback(IAsyncResult ar)
{
...
file.EndWrite(ar);
...
}
下面是我的理解,大家帮我看看对不对:
当进程执行到mehtod的file.BeginWrite..这句时,是不是生成了一个新的线程(比如:a1线程)来执行file.BeginWrite函数,当这个线程结束后,再生成另一个新线程(比如:a2线程)来执行 filewriteback回调函数,两个线程不是同一个吧?

在这里先谢谢大家了,我是新手,大家帮帮忙 :)
...全文
350 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
isaacyh 2005-01-25
  • 打赏
  • 举报
回复
当我们声明一个委托的时候,例如:
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执行完后才执行,不会出错。
mari 2005-01-25
  • 打赏
  • 举报
回复
当进程执行到mehtod的file.BeginWrite..这句时,是不是生成了一个新的线程(比如:a1线程)来执行file.BeginWrite函数,当这个线程结束后,再生成另一个新线程(比如:a2线程)来执行 filewriteback回调函数,两个线程不是同一个吧?

不是这样的,只是生成了一个新线程,再加上主线程,所以,这时是两个线程(不是你理解的三个线程)
我上面测试数据是开始异步调用后,在主线程循环写数,你可以看到,异步调用回调函数所写的字符写在我主线程循环数的中间。
mari 2005-01-25
  • 打赏
  • 举报
回复
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
finalrender 2005-01-08
  • 打赏
  • 举报
回复
顶!
cxyPioneer 2004-11-21
  • 打赏
  • 举报
回复
up
gaoxingbugaoxing 2004-11-21
  • 打赏
  • 举报
回复
谢谢你lanbaibai(蓝白白)
但还是不太明白 :)
同时执行?那么如果a1线程的写入工作没做完,a2线程执行的filewriteback方法将被阻塞么?

是这样么?

谢谢了,我一直想搞清楚这个问题 :)
lanbaibai 2004-11-21
  • 打赏
  • 举报
回复
不是的,你可以理解是生成了一个新的线程执行file.BeginWrite函数,但不是等这个线程结束后再执行filewriteback回调函数,而是这两个线程同时在执行。明白吗?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧