TCP异步读数据后关闭连接的问题

风中飘过一行代码 2013-05-10 01:28:38
我的异步读数据代码如下:

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()

我想让里面的回调方法执行完再往下走,但是为什么不管用?主线程还是继续执行下面的语句了。。
...全文
238 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
我要坚强 2013-05-13
  • 打赏
  • 举报
回复
或许thread=new Thread(this); 然后thread.jion()会有效果吧,手头没有vs没法调试,只是猜想一下,哈哈 不过异步操作同步完成,是不是有点那个
ariesget 2013-05-13
  • 打赏
  • 举报
回复
不明白怎么会困难。楼上已经给出例子了。我就不写了。
我要坚强 2013-05-13
  • 打赏
  • 举报
回复
引用 7 楼 guyuekkk11 的回复:
[quote=引用 6 楼 ariesget 的回复:] 自己建个类或者结构体包含你想要的所有对象作为回调函数的参数传过去不就好了?
也想过这种方法,但是比较困难,不能用这种方法,还有其他方法吗?[/quote] 最简单的方法了怎么困难 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线程
  • 打赏
  • 举报
回复
引用 6 楼 ariesget 的回复:
自己建个类或者结构体包含你想要的所有对象作为回调函数的参数传过去不就好了?
也想过这种方法,但是比较困难,不能用这种方法,还有其他方法吗?
ariesget 2013-05-13
  • 打赏
  • 举报
回复
自己建个类或者结构体包含你想要的所有对象作为回调函数的参数传过去不就好了?
  • 打赏
  • 举报
回复
引用 3 楼 ariesget 的回复:
NetworkStream.Close就可以,NetworkStream会关闭它所关联的Socket连接,在它的Dispose方法中有做相关处理。
现在我想在回调函数(apiReadCallBack)中调用第一个模块try里声明的一个对象(假设:baseProcess process = null 我想在apiReadCallBack中调用process),怎么办?不能把那个对象声明成全局变量,怎么实现?
feng_3630 2013-05-10
  • 打赏
  • 举报
回复
NetworkStream 关闭
ariesget 2013-05-10
  • 打赏
  • 举报
回复
NetworkStream.Close就可以,NetworkStream会关闭它所关联的Socket连接,在它的Dispose方法中有做相关处理。
  • 打赏
  • 举报
回复
高手在哪里呢??
HQTGS 2013-05-10
  • 打赏
  • 举报
回复
问题有用,关注一下!

110,530

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧