我的异步读数据代码如下:                TcpListener l = (TcpListener)ar.AsyncState;
                TcpClient client = l.EndAcceptTcpClient(ar);
                try
                {
                    NetworkStream ns = client.GetStream();
                    data = new Byte[client.ReceiveBufferSize];
                    ns.BeginRead(data, 0, data.Length, new AsyncCallback(myReadCallBack), ns);
                }myReadCallBack方法如下:        public void myReadCallBack(IAsyncResult ar)
        {
            NetworkStream ns = (NetworkStream)ar.AsyncState;
            int dataSize = ns.EndRead(ar);
            Byte[] realData = new Byte[dataSize];
            for (int i = 0; i < dataSize; i++)
            {
                realData[i] = data[i];
            }
            data = null;
            Byte[] returnBytes;
            int operation = Convert.ToInt32(realData[1]);
            if (operation == 0)
            {
                returnBytes = doConnect();     
            }
            else
            {
                returnBytes = null;
            }
            ns.Write(returnBytes, 0, returnBytes.Length);
        }1.我现在想在myReadCallBack读取完数据后关闭client,怎么写?myReadCallBack没法取到它啊?
2.
ns.BeginRead(data, 0, data.Length, new AsyncCallback(myReadCallBack), ns);把这句话变成:IAsyncResult ar=ns.BeginRead(data, 0, data.Length, new AsyncCallback(myReadCallBack), ns);
ar.AsyncWaitHandle.WaitOne()我想让里面的回调方法执行完再往下走,但是为什么不管用?主线程还是继续执行下面的语句了。。

解决方案 »

  1.   

    NetworkStream.Close就可以,NetworkStream会关闭它所关联的Socket连接,在它的Dispose方法中有做相关处理。
      

  2.   

    现在我想在回调函数(apiReadCallBack)中调用第一个模块try里声明的一个对象(假设:baseProcess process = null 我想在apiReadCallBack中调用process),怎么办?不能把那个对象声明成全局变量,怎么实现?
      

  3.   

    也想过这种方法,但是比较困难,不能用这种方法,还有其他方法吗?
    最简单的方法了怎么困难
    public class ClientObj{
    public ClientObj(....){...}
    public TcpClient Client{get;private set;}
    public NetworkStream ClientNetworkStream{get;private set;}
    }
    ns.BeginRead(data, 0, data.Length, new AsyncCallback(myReadCallBack), new ClientObj(){....} );
    2.我想让里面的回调方法执行完再往下走,但是为什么不管用?主线程还是继续执行下面的语句了。。
    你的监听也是异步的,异步io上来你阻止当前线程,的当前线程也是后台的IO线程
      

  4.   

    或许thread=new Thread(this); 然后thread.jion()会有效果吧,手头没有vs没法调试,只是猜想一下,哈哈
    不过异步操作同步完成,是不是有点那个