我的异步读数据代码如下: 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()我想让里面的回调方法执行完再往下走,但是为什么不管用?主线程还是继续执行下面的语句了。。
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()我想让里面的回调方法执行完再往下走,但是为什么不管用?主线程还是继续执行下面的语句了。。
解决方案 »
- 求代码解释
- VS2010打开时假死
- VS2008 C#应用程序调用vc的dll,如何设置断点进行调试
- 关于员工工资汇总表的问题
- XML编程:怎么用InsertAfter()方法把新建的节点插入到已有的XML文件中去?
- FileSystemWatcher能不能在不使用多线程的情况下监视多个文件夹?
- 怎么把程序中的每个变量传给水晶报表???比如我要统计1月到5月的入库数量,怎么把1月和5月这两个变量传递给水晶报表让他显示出来!
- http请求
- 怎样打包把整个NET FRAME装到程序里面?
- 除了VS7.0,还有可视化的C#的编辑环境嘛?
- Excel存入数据库
- C#如何获取属性的纯文本,比如string a,我要获取a,求大神
最简单的方法了怎么困难
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线程
不过异步操作同步完成,是不是有点那个