日期:2014-05-17  浏览次数:20743 次

异步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了,用同步方式,需要自己去编程保障线程安全