ソケットベースのテレメトリアプリを作成しています。2つの無線モデムを使用してデータを送受信します。1つのアプリはモデム1を介してデータを送信し、もう1つのプログラムはモデム2を介してデータを取得します。送信間隔は1秒のようです。レシーバーアプリ(サーバー)はCPUとRAMのリソースのほとんどを使用しており(99%のcpu使用量!)、そのメモリ使用量は着実に増加しています!数分後、プログラムがほとんど応答を停止し、データがまったく正しくないため、データを解析できません。プログラムは送信されたデータのコピーをいくつか受信しているようです。元のデータパケットは約70バイトですが、しばらくするとサイズが数秒増えると、受信バッファーがいっぱいになり、データが以前のデータと混合されていると思います。いくつかの提案を探しています。サーバープログラムの受信ハンドラーは次のとおりです。
private void DataReceive()
{
handler.ReceiveBufferSize = 100;
try
{
byte[] bytes = new byte[100];
int byteRec;
while (true)
{
timer1.Enabled = true;
while (true)
{
byteRec = handler.Receive(bytes);
if (byteRec > 0)
{
data = System.Text.Encoding.UTF8.GetString(bytes, 0, byteRec);
break;
}
}
if (data.Length >= 30)
{
if (data.Substring(0, 1) == "#")//pasrse data, correct!
{
label27.Text = data.Length.ToString();
textBox1.Text = data;
string a = data.Substring(1);
string[] b = a.Split('-');
SetControlPropertyThreadSafe(lblTotal, "Text", b[0]);
SetControlPropertyThreadSafe(lblFlow, "Text", b[1]);
float real_analog2 = (1 - (((20 - float.Parse(b[4])) / (20 - 4)))) * Analog2_Max;
if (real_analog2 < 0)
real_analog2 = 0;
SetControlPropertyThreadSafe(lblAnalog, "Text", real_analog2.ToString());
if (b[2] == "1")//off
SetControlPropertyThreadSafe(lblMotion, "Text", "off");
else if (b[2] == "0")//on
SetControlPropertyThreadSafe(lblMotion, "Text", "on");
if (b[3] == "1")//off
SetControlPropertyThreadSafe(lblMotion2, "Text", "off");
else if (b[3] == "0")//on
SetControlPropertyThreadSafe(lblMotion2, "Text", "on");
SetControlPropertyThreadSafe(lblV1, "Text", b[5]);
SetControlPropertyThreadSafe(lblV2, "Text", b[6]);
SetControlPropertyThreadSafe(lblV3, "Text", b[7]);
SetControlPropertyThreadSafe(lblI1, "Text", b[8]);
SetControlPropertyThreadSafe(lblI2, "Text", b[9]);
SetControlPropertyThreadSafe(lblI3, "Text", b[10]);
SetControlPropertyThreadSafe(lblLevelPercent, "Text", b[11]);
SetControlPropertyThreadSafe(lblLevelValue, "Text", b[12]);
}
}
FillLstMsg(data);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}