异步socket 有几个点不明白! 在线等!!!!!
我正在学习c#socket 编程 ,有些问题不能理解请大师赐教!
1、 while(true){
allDone.Reset();
server.BeginAccept(new AsyncCallback(Accept), server);
allDone.WaitOne();
}
如果没有allDone的参与 直接内存报异常 引发类型为“System.OutOfMemoryException”的异常
但是加上他是不是影响了效率,并且失去了异步的效果,可能是我对ManualResetEvent理解的不正确
2、//接收数据的回调函数
public void read_Callback(IAsyncResult iar)
{
try {
Socket so = (Socket)iar.AsyncState;
int recv = so.EndReceive(iar);
接受数据的很多例子里都没有使用 ManualResetEvent 这是为什么我就不明白了, 但是我感觉如果 BeginAccept和EndReceive要是都用了ManualResetEvent 那不就成同步的了,也就失去了使用回调函数的异议了
3、异步socket 如何安全的关闭SOCKET 还有就是 用不用对系统线程进行监控,因为我写的程序
public void read_Callback(IAsyncResult iar)
{
try {
Socket so = (Socket)iar.AsyncState;
int recv = so.EndReceive(iar);
接受的异步连接的运行不会少,但是上面的总是丢失,少接收客户端发送数据,上面这个回调函数没有运行,不知道为什么!!!
我 找不到原因 !!!!!!!!!!!!!!
------解决方案--------------------1、 while(true){
allDone.Reset();
server.BeginAccept(new AsyncCallback(Accept), server);
allDone.WaitOne();
}
修改为
1、 server.BeginAccept(new AsyncCallback(Accept), server);
就是这样!真正的异步处理程序,没有循环、没有阻塞、非常简洁清晰。
反而是那种不伦不类、用同步顺序编程的方式来模拟异步的,让你的程序变得复杂和容易死机。
------解决方案--------------------Begin-End封装的异步主要是利用AsyncCallback回调机制来解决“并发”的问题
循环开线程的话,里面就不应该再用Begin-End了,用同步方式,需要自己去编程保障线程安全