c# socket 通信稳定性 与速度的 problem

兴风作浪的梦 2013-08-04 10:14:29
简单说下我的大体情况就是 我 现在 搞上下位机 下位机是 stm32 用的 协议是lwip 我在里面编了就是 一直向上位机发送数据 每个包 1460 吧 然后 上位机 我就是 用的 vs2010 编的 语言是 vc#.net 现在 通信速度 基本是 1M/s 以上 但是 不是 很稳定 现在 就是 有个问题就是 我用的 阻塞的方式 当连接 服务器与客户端连接后 然后 开始 接收数据下面就是代码 其中 showMsg(stringdata );我是用的 委托 invoke 下面可以看见 就是 在 当前窗体 显示 接收到的数据 并且不断地 相加
[/ while (Connected)
{


try {
if (jx)
{
int recv = newclient.Receive(data);
if (recv == 0)
{
MessageBox.Show("sorry buffer is empty!!!!");
break;
}
y += recv;
Console.WriteLine(recv.ToString());
string stringdata = Encoding.ASCII.GetString(data, 0, recv);
showtext(y.ToString());
showMsg(stringdata );

}
}
catch (Exception e)
{
MessageBox .Show(e.Message );
}
finally
{
}
}
}
]

这是 showmsg(string msg)的程序
public void showMsg(string msg)
{
try
{
{
//在线程里以安全方式调用控件
if (receiveMsg.InvokeRequired)
{
MyInvoke _myinvoke = new MyInvoke(showMsg);
receiveMsg.Invoke(_myinvoke, new object[] { msg });
}
else
{


receiveMsg.AppendText(msg);

}
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
finally
{
}
}
现在 就是 我 发现 速度 不断的下降 不知道 是为什么 然后 我 怀疑 是不是显示这块 有问题 然后 我就把 showmsg 注释掉 发现速度 稳定下来了 能运行 半小时 以上 我想问下我
一、 在不影响 接受速度的情况下我该怎么 编程
二、我想用 异步 是否 好点?
三、或者我把显示 去掉直接 改为实时 保存到 某文件中区 还有 就是保存 最好用 什么形式保存 就是代码 我的 程序里面是 这样保存的
private void button1_Click(object sender, EventArgs e)
{
StreamWriter strWriter = new StreamWriter(@"D:\1.txt", false);//保存到C盘的store这个 txt文件里面
strWriter.Write(receiveMsg .Text );
}

四 、如果 上面的解决了我想请问高手 就是 正常情况下 要考虑哪些 factor 去考虑 使他 编的更加的 健全 速度稳定 性上 更好 在此 希望大神们 能够 help me
本人 刚刚开始学 所以 不懂得很多
...全文
378 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
兴风作浪的梦 2013-08-04
  • 打赏
  • 举报
回复
引用 5 楼 xiaozhi_5638 的回复:
1.receive数据后,如果马上进行处理,会影响接收数据的效率,所以,你可以将接收到的数据放入一个公共缓冲区,然后专门开辟线程进行处理 2.如果确实不想另开辟线程,请将Invoke改为BeginInvoke,它不会阻塞接收数据线程 3.对于这个需求,改为“异步模式”,性能替身效果不大
就是 我把 invoke 变成begininvoke 刚刚试验了一下 程序就是 运行几秒 就接收不到数据了 。。
请叫我卷福 2013-08-04
  • 打赏
  • 举报
回复
替身=》提升
请叫我卷福 2013-08-04
  • 打赏
  • 举报
回复
1.receive数据后,如果马上进行处理,会影响接收数据的效率,所以,你可以将接收到的数据放入一个公共缓冲区,然后专门开辟线程进行处理 2.如果确实不想另开辟线程,请将Invoke改为BeginInvoke,它不会阻塞接收数据线程 3.对于这个需求,改为“异步模式”,性能替身效果不大
兴风作浪的梦 2013-08-04
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
你是怎么看是否收到数据的呢? 另外随便问“这可能是什么原因呢?”我是不回去罗列什么东西的。我只能针对“亲自调试分析”过的信息来判断,我从来不多说空想的意见。 例如你的 MessageBox.Show(e.Message) 这类代码,在多线程的程序中就不可能使用。通常可以把信息以 Debug.Print 方式打印出来。
本程序用的 就是 rcv 这个参数 然后 用定时 来判断 接受多少字节的数据 除以 秒数就是了 还有我这个 就是刚刚试验就好了 能运行很长时间 还有我这个还是 测试程序 很多东西不太懂
  • 打赏
  • 举报
回复
你是怎么看是否收到数据的呢? 另外随便问“这可能是什么原因呢?”我是不回去罗列什么东西的。我只能针对“亲自调试分析”过的信息来判断,我从来不多说空想的意见。 例如你的 MessageBox.Show(e.Message) 这类代码,在多线程的程序中就不可能使用。通常可以把信息以 Debug.Print 方式打印出来。
兴风作浪的梦 2013-08-04
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
int recv = newclient.Receive(data) 这一行以后的代码可以在另外一个子线程中执行。 当然这一行代码可以改为使用BeginReceive。 异步的程序要更加精炼、简洁。只要你用正确的思维方式去理解异步,它就非常自然。
我现在 就是 直接把显示 去掉然后 运行 了 几分钟后 收不到数据了 这可能是什么原因 呢 ??
  • 打赏
  • 举报
回复
int recv = newclient.Receive(data) 这一行以后的代码可以在另外一个子线程中执行。 当然这一行代码可以改为使用BeginReceive。 异步的程序要更加精炼、简洁。只要你用正确的思维方式去理解异步,它就非常自然。

110,499

社区成员

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

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

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