关于异步SOCKET,BeginAccept 线程阻塞的疑惑?

jiezi316 2008-06-16 09:22:21

//.....
ManualResetEvent allDone = new ManualResetEvent(false);//信号量
listener.Listen(100);
while (true)
{
allDone.Reset();
listener.BeginAccept(new AsyncCallback(AcceptCallBack),listener);
allDone.WaitOne();
}
void AcceptCallBack(IAsyncResult result)
{
allDone.Set();
//......
}

我刚刚接触SOCKET,有点迷糊了。
ManualResetEvent.Reset() 说明描述该方法将事件状态设置为非终止,导致线程阻塞,但我跟踪到这部发现后面的还是执行了的,并没有阻塞(疑惑一),然后执行到WaitOne()方法阻塞了,这样主线程阻塞了,那AcceptCallBack方法种的Set(),也就是设置为终止状态的方法,怎么会执行呢,不就始终阻塞了吗?(疑惑二),但我运行程序发现并不是这样的。当主线程阻塞后,但有CLIENT请求该服务端程序,还是会执行AcceptCallBack的方法的。希望高手们解释下,谢谢了
...全文
992 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
roye2009 2010-07-08
  • 打赏
  • 举报
回复
不需要用信号, 直接在AcceptCallBack 中再BeginAccept

listener.Listen(100);

listener.BeginAccept(new AsyncCallback(AcceptCallBack),listener);


void AcceptCallBack(IAsyncResult result)
{
Socket listener = (Socket)result;
Socket s = listener.EndAccept(result)
listener.BeginAccept(new AsyncCallback(AcceptCallBack),listener);
}

sxlfybb 2008-06-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zzultc 的回复:]
疑惑一:reset()并不是让本线程阻塞,而是让那些等待这个事件的线程阻塞。所以,你的程序继续执行,这是正确的。
疑惑二:set()的意思同上,让那些等待此事件的线程运行。
waitone(),线程们在此处等待事件。
你不要光看SDK文档里的对某个函数的表面解释,要弄清楚它背后的真实意思。
[/Quote]

这个解释的好,通俗易懂
zzultc 2008-06-16
  • 打赏
  • 举报
回复
你的这段程序,貌似是使用异步IO来实现同步的Accept()函数啊?
zzultc 2008-06-16
  • 打赏
  • 举报
回复
你的程序大体上运行是这样的:
主线程 事件 异步线程池线程

一个循环
allDone.Reset(); 无信号 无
BeginAccept 无信号 开始运行(等待连接)
allDone.WaitOne();//阻塞,等待信号 无信号 等待连接
阻塞,等待信号 无信号 等待连接
///////////以上两个线程都将会阻塞直到假设有个客户来连接////////////////
阻塞,等待信号 无信号 AcceptCallBack()//刚刚开始调用
阻塞,等待信号 有信号 allDone.Set();
运行,开始进入下一个循环 有信号 做自己的工作,下个连接不一定这个线程负责
在下一个循环第一句将再次把信号置为无 无信号 /////////
zzultc 2008-06-16
  • 打赏
  • 举报
回复
疑惑一:reset()并不是让本线程阻塞,而是让那些等待这个事件的线程阻塞。所以,你的程序继续执行,这是正确的。
疑惑二:set()的意思同上,让那些等待此事件的线程运行。
waitone(),线程们在此处等待事件。
你不要光看SDK文档里的对某个函数的表面解释,要弄清楚它背后的真实意思。
jiezi316 2008-06-16
  • 打赏
  • 举报
回复
没人知道?

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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