137867312 2014-09-11 07:52 采纳率: 0%
浏览 744

程序不能持续运行问题

运行状况:我用C#语言编写了一个client端程序,放在阿里云上与Server端(不用我编写)通过网络通信,主要是接收Server端上传上来的数据,但每隔15min会向Server端发送一次命令。

运行现象:当整个程序运行到几十个小时(最长的是82个小时)后,出现“无法向网络连接中写入数据”的报错并指示CircleCallAll()命令代码段出错。

求助问题:请各位大牛们分析一下可能出现问题的原因。

相关代码`:接收数据部分
public class dataread//接收数据基础类
{
public NetworkStream netstream;
public byte[] PackageBuffer;
public dataread(NetworkStream sn, int buffersize)
{
this.netstream = sn;
this.PackageBuffer = new byte[buffersize];
}
}
private void ReadCallBack(IAsyncResult ar)//接收数据的回调函数
{
try
{
int rec = netStream.EndRead(ar);
PackageBufferLength = PackageBuffer.Length;
ShowPackage();//显示接收到的报文
ParsePackageBuffer();//解析接收到的报文

netStream.BeginRead(PackageBuffer, 0, PackageBuffer.Length, new AsyncCallback(this.ReadCallBack), netStream);
netStream.Flush();
}
catch (Exception ex)
{
txtState.Text = ex.Message;
}
}

定时下发命令部分
private void timer5_Tick(object sender, EventArgs e)
{
tm5++;
while (tm5 % 901 == 0)
{
netStream.Flush();
rtb.Clear();
CircleCallAll();//命令函数
break;
}
}
private void CircleCallAll()
{
this.timer5.Stop();
······//代码部分
this.timer5.Start();
tm5 = 1;
}
`

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-02 16:43
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    根据您提供的代码,以下是一些可能导致此问题的原因:

    1. 网络问题:可能是网络连接不稳定或中断导致的。在循环调用时,如果网络连接断开,可能会导致某些操作失败,例如EndRead()方法可能抛出异常。

    2. 资源管理器问题:在调用BeginRead()之前,应确保所有缓冲区已经准备好,并且没有其他线程正在读取这些缓冲区。这可以通过使用同步锁来实现。

    3. 超时设置:在您的代码中,timer5_TickCircleCallAll之间的间隔时间设置为15分钟。然而,在实际运行过程中,这个时间间隔可能会因为网络延迟或其他因素而变长。为了防止命令发送过晚导致错误,可以考虑将这两个事件处理逻辑合并在一起,或者调整间隔时间以适应网络情况。

    4. 性能问题:如果您发现每次调用ParsePackageBuffer()netStream.BeginRead()的时间都很长,那么可能存在性能瓶颈。这可能是由于内存泄漏、异步任务等待时间较长或者其他性能问题引起的。

    解决这些问题的方法包括但不限于:

    • 检查网络状态:确保网络连接稳定。
    • 优化代码结构:减少不必要的同步锁定。
    • 调整定时器间隔:根据实际情况调整命令发送频率。
    • 日志记录:添加更多的日志信息,以便于追踪问题原因。

    完整的解决方案可能需要结合具体的环境和配置进行调试和验证。希望对您有所帮助!

    评论

报告相同问题?