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
本人 刚刚开始学 所以 不懂得很多
...全文
467 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。 异步的程序要更加精炼、简洁。只要你用正确的思维方式去理解异步,它就非常自然。
内容概要:本文围绕“单相逆变器闭环逆变电路PWM模型仿真研究”展开,基于Simulink平台构建单相逆变器的闭环控制系统仿真模型,重点研究PWM调制技术在逆变电路中的应用与实现。文中详细阐述了系统架构设计、电压电流双闭环控制策略的实现原理、控制器参数设计及仿真建模全过程,并通过仿真结果验证了控制方案在动态响应、稳态精度与系统稳定性方面的有效性。同时,文档还涵盖多种电力电子系统典型应用场景,如多类型短路故障仿真(中性点不接地、经小电阻接地、经消弧线圈接地等)、软开关技术、微电网能量管理、MPPT控制等,体现出较强的技术综合性和工程实践价值。; 适合人群:电气工程、自动化、电力电子与新能源等相关专业的高校本科生、研究生、科研人员,以及从事电力系统仿真、逆变器设计与新能源并网技术研发的工程技术人员。; 使用场景及目标:①掌握基于Simulink的单相逆变器闭环控制系统建模与PWM仿真方法;②深入理解双闭环控制、SPWM/SVPWM调制、系统稳定性分析等核心技术原理;③为课程设计、毕业设计、科研项目或实际工程开发提供可复用的仿真模型与技术支持; 阅读建议:建议结合文中仿真模型动手实践,重点掌握PI控制器参数整定、PWM信号生成机制与仿真结果分析方法,同时可延伸学习文档中涉及的软开关、故障仿真、微电网控制等关联技术,以拓展系统级设计能力。

111,131

社区成员

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

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

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