在异步通信中,在异步接受数据完成时 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();
}
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();
}
解决方案 »
- 如何使用webbrowser实现html表格操作
- C#构造函数中给属性赋值
- 关于Cookie!求解决,在线等!
- 关于C#发送邮件
- 怎样将WinForm中的FolderBrowserDialog控件的弹出对话框作为一个控件放在Form中使用,而不是以弹出对话框的方式?
- 打了sp1的vs2005,工具箱依然无法显示自定义控件
- 请问 如何用程序改变字体颜色?
- 关于字符串截断显示在某个区域的问题
- Web窗体中如何在一个窗体修改另一个窗体内TextBox1控件的text属性?答对结贴!
- richTextBox1.AppendText(builder.ToString())无法执行
- 谁能帮我测试下程序(聊天室)
- 不可访问,受保护级别限制
socket C#通讯编程(整理)|大家可以进来学习
{
stream.BeginRead(state.buffer, 0, m_BufferSize, new AsyncCallback(ReadCallBack), state);
}
第一次异步回调就关闭线程了,这里你又重复回调,再次关闭,应该是会出问题的~
这个方法是如何使用的?