异步网络通信编程问题

qixingl 2009-12-18 05:30:45
在异步通信中,在异步接受数据完成时 stream.EndRead(result) 报错“无法从传输连接中读取数据: 由于线程退出或应用程序请求,已放弃 I/O 操作”,怎么回事,线程出错?代码如下:
private void BeginReceiveData()
{
if (m_Connected)
{
if (!m_Client.Connected)
{
ReConnect();
return;
}
StateObject state = new StateObject();
state.buffer=new byte[m_BufferSize];
state.dataStream = m_Client.GetStream();
m_Client.GetStream().BeginRead(state.buffer, 0, m_BufferSize, new AsyncCallback(ReadCallBack), state);
}
}
private void ReadCallBack(IAsyncResult result)
{
if (!m_Connected)
return;
StateObject state = (StateObject)result.AsyncState;
NetworkStream stream = state.dataStream;
try
{
if (!stream.CanRead)
return;
int byteLen = stream.EndRead(result); //这里报错
//if (byteLen == 0)
//{
// ReConnect();
// return;
//}
DataUnit duReceive = new DataUnit();
duReceive.Data = new byte[byteLen];
Array.Copy(state.buffer,duReceive.Data,byteLen);
List<DataUnit> duList = BasePacket.ParsePacket(duReceive, ref this.m_DataLeft);
if (duList.Count > 0)
{
for (int i = 0; i < duList.Count; i++)
{
packQueue.AddPacket(new BasePacket(duList[i]));
}
}
this.m_LastRecvTime = DateTime.Now;
Array.Clear(state.buffer, 0, m_BufferSize);
stream.BeginRead(state.buffer, 0, m_BufferSize, new AsyncCallback(ReadCallBack), state);
}
catch(Exception ex)
{
string s = ex.Message;
ReConnect();
}
...全文
131 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenbin 2009-12-18
  • 打赏
  • 举报
回复
BeginReceiveData() 使用可能有点问题。
这个方法是如何使用的?
ginni215 2009-12-18
  • 打赏
  • 举报
回复
private void ReadCallBack(IAsyncResult result)
{
stream.BeginRead(state.buffer, 0, m_BufferSize, new AsyncCallback(ReadCallBack), state);
}


第一次异步回调就关闭线程了,这里你又重复回调,再次关闭,应该是会出问题的~

111,120

社区成员

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

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

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