//.....
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的方法的。希望高手们解释下,谢谢了
解决方案 »
- 如何获取域内的AD帐号???
- 网上视频点播,统计流量
- sql 时间触发器
- 怎样将存入数据库中的html代码(已处理)原样解析到textbox中?
- 问个关于生成XML的问题,高手帮忙:)
- 如何设置datagrid自动生成列的列头和数据都不换行呢?
- 谁有<<asp.net办公自动化系统开发实例导航》这本书啊?
- 如何将读入的HTML流转换为TXT文件
- *.resx 文件是做什么用的?什么时候会用到他?请举个例子!----------------------
- 请问各位高手那里有树型控件的下栽?
- URL重写配置IIS映射后无法浏览静态页面
- ReportViewer可以显示报表,导出Excel/pdf点保存后,显示无法下载,请求的站点不可用
疑惑二:set()的意思同上,让那些等待此事件的线程运行。
waitone(),线程们在此处等待事件。
你不要光看SDK文档里的对某个函数的表面解释,要弄清楚它背后的真实意思。
主线程 事件 异步线程池线程 一个循环
allDone.Reset(); 无信号 无
BeginAccept 无信号 开始运行(等待连接)
allDone.WaitOne();//阻塞,等待信号 无信号 等待连接
阻塞,等待信号 无信号 等待连接
///////////以上两个线程都将会阻塞直到假设有个客户来连接////////////////
阻塞,等待信号 无信号 AcceptCallBack()//刚刚开始调用
阻塞,等待信号 有信号 allDone.Set();
运行,开始进入下一个循环 有信号 做自己的工作,下个连接不一定这个线程负责
在下一个循环第一句将再次把信号置为无 无信号 /////////
void AcceptCallBack(IAsyncResult result)
{
Socket listener = (Socket)result;
Socket s = listener.EndAccept(result)
listener.BeginAccept(new AsyncCallback(AcceptCallBack),listener);
}