异步读写数据TcpClient,为啥参数类中的值丢了呢

pooky 2016-05-31 07:01:23
public void myReadCallBack1(IAsyncResult ar)
{
MyData state = (MyData)ar.AsyncState;
string IPPort = state.tcp.Client.RemoteEndPoint.ToString();
string ip = IPPort.Substring(0, IPPort.IndexOf(":"));

int numberOfBytesRead = state.tcp.GetStream().EndRead(ar);
if (numberOfBytesRead > 0)
{
StringBuilder sb = new StringBuilder(BitConverter.ToString(state.buffer, 0, numberOfBytesRead));
OnReceived(ip, sb);

lock (locker)
{
foreach (MyData oldRD in CtrlDataList1)
{
if (oldRD.tcp == state.tcp)
{
CtrlDataList1.Remove(oldRD);

//新接收的数据
byte[] data = new byte[numberOfBytesRead];
Array.Copy(state.buffer, data, numberOfBytesRead);

MyData newRD = new MyData(oldRD, oldRD.buffer.Concat(data).ToArray());
CtrlDataList1.Add(newRD);
break;
}
}
}
}

state.buffer = new byte[1000];
state.tcp.GetStream().BeginRead(state.buffer, 0, state.buffer.Length, readCallBack1, state);
}




private void myWriteCallBack(IAsyncResult ar)
{
MyData state = (MyData)ar.AsyncState;
string IPPort = state.tcp.Client.RemoteEndPoint.ToString();
string ip = IPPort.Substring(0, IPPort.IndexOf(":"));

state.tcp.GetStream().EndWrite(ar);

StringBuilder sb = new StringBuilder(BitConverter.ToString(state.buffer));
OnSend(ip, sb);

//接收
if (state.tcp.GetStream().CanRead)
{
MyData newRD = new MyData(state, new byte[1000]);
newRD.tcp.GetStream().BeginRead(newRD.buffer, 0, newRD.buffer.Length, readCallBack1, newRD);
}
}

就是这个MyData,定义了很多变量,发出的时候是有值的,但是读回来的时候数据丢了(buffer和tcp的值没丢,我想要保存的中间变量的值都没了)。

帮忙看看问题出在哪里?谢谢!
...全文
172 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Poopaye 2016-06-01
  • 打赏
  • 举报
回复
只看到你把数据读入buffer,哪里给abcd赋值了?
pooky 2016-06-01
  • 打赏
  • 举报
回复
上面是MyData的类, 我通讯的时候, 第一次握手读到A的值, 第二次握手读到B的值, 第三次握手读到C的值, 第四次握手读到D的值,同时要将ABCD联合起来计算生成一个结果。 我遇到的问题是:到下一次握手的时候,前面握手的值丢失没有了。 这个函数现在稍微改动了一下,但是没有帮助: public void myReadCallBack1(IAsyncResult ar) { MyData state = (MyData)ar.AsyncState; string IPPort = state.tcp.Client.RemoteEndPoint.ToString(); string ip = IPPort.Substring(0, IPPort.IndexOf(":")); int numberOfBytesRead = state.tcp.GetStream().EndRead(ar); if (numberOfBytesRead > 0) { StringBuilder sb = new StringBuilder(BitConverter.ToString(state.buffer, 0, numberOfBytesRead)); OnReceived(ip, sb); lock (locker) { foreach (MyData oldRD in CtrlDataList1) { if (oldRD.tcp == state.tcp) { CtrlDataList1.Remove(oldRD); //新接收的数据 byte[] data = new byte[numberOfBytesRead]; Array.Copy(state.buffer, data, numberOfBytesRead); MyData newRD = new MyData(oldRD, oldRD.buffer.Concat(data).ToArray()); CtrlDataList1.Add(newRD); break; } } } state.buffer = new byte[1000]; state.tcp.GetStream().BeginRead(state.buffer, 0, state.buffer.Length, readCallBack1, state); } }
pooky 2016-06-01
  • 打赏
  • 举报
回复
public class MyData { public TcpClient tcp; public byte[] buffer; public string A = ""; public string B = ""; public int C = 0; public int D = 0; public MyData() { } public MyData(MyData data) { this.A = data.A; this.B = data.B; this.C = data.C; this.D = data.D; } public MyData(MyData data, byte[] b) { this.buffer = b; this.A = data.A; this.B = data.B; this.C = data.C; this.D = data.D; } public void Clear() { this.A = ""; this.B = ""; this.C = 0; this.D = 0; } }
Justin-Liu 2016-06-01
  • 打赏
  • 举报
回复
你代码里怎么那么多MyData对象
Poopaye 2016-06-01
  • 打赏
  • 举报
回复
我能看到赋值的地方就在2个构造函数上 但是构造函数还要依赖另一个MyData 所以结论就是第一个MyData没值,后面的MyData都没值
Poopaye 2016-06-01
  • 打赏
  • 举报
回复
引用 7 楼 pooky 的回复:
后台线虫中循环处理CtrlDataList1,然后给abcd赋值,再更新CtrlDataList1中的值: CtrlDataList1.Remove(oldRD); CtrlDataList1.Add(newRD); (跟上面类似的代码)
引用 6 楼 shingoscar 的回复:
只看到你把数据读入buffer,哪里给abcd赋值了?
上面的代码也没给abcd赋值啊
pooky 2016-06-01
  • 打赏
  • 举报
回复
后台线虫中循环处理CtrlDataList1,然后给abcd赋值,再更新CtrlDataList1中的值: CtrlDataList1.Remove(oldRD); CtrlDataList1.Add(newRD); (跟上面类似的代码)
引用 6 楼 shingoscar 的回复:
只看到你把数据读入buffer,哪里给abcd赋值了?
pooky 2016-05-31
  • 打赏
  • 举报
回复
MyData的属性,除了TCP和buffer,别的都会丢
Poopaye 2016-05-31
  • 打赏
  • 举报
回复
根本看不出来到底啥丢了

110,533

社区成员

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

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

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