私は現在、I / Oデバイスと対話するプログラムを作成しており、イン/アウト接続をチェックするためにx秒ごとにデバイスをポーリングする方法が必要でした。これを行うために、タイマーとタイマーイベントハンドルを使用して、ポーリングを実行するスレッドを作成するボタンを使用しました。ただし、タスクマネージャーでは、時間が経つにつれて徐々にメモリを消費していることに気付きました。以下は、私の問題に関連する(私が思う)コードのスニペットです。
スレッドを作成するためのボタン:
private void btnConnect_Click(object sender, EventArgs e)
{
new Thread(start).Start();
}
タイマーを含むスレッド:
public void start()
{
timer = new System.Timers.Timer(1000);
timer.Elapsed += new ElapsedEventHandler(timerElapsed);
timer.Enabled = true;
}
ElapsedEventHandler:
public void timerElapsed(object sender, ElapsedEventArgs e)
{
connect();
}
そして最後にメソッドconnect();:
public void connect()
{
StringBuilder sb = new StringBuilder();
sb.Append(txtIPseg1.Text + "." + txtIPseg2.Text + "." + txtIPseg3.Text + "." + txtIPseg4.Text);
int Port = int.Parse(txtPort.Text);
string address = sb.ToString();
//send data
byte[] bData = new byte[71];
bData[0] = 240;
bData[1] = 240;
bData[2] = 0;
bData[3] = 1;
bData[68] = 240;
bData[69] = 240;
bData[70] = this.CalculateCheckSum(bData);
try
{
byte[] result = this.SendCommandResult(address, Port, bData, 72);
if (result != null)
{
this.Invoke((MethodInvoker)delegate
{
txtOutput1.Text = (result[4] == 0x00 ? "HIGH" : "LOW"); // runs on UI thread
});
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
リークはタイマー、またはconnect();メソッドで使用されるanonデリゲートのいずれかから発生していると確信しています。誰かアイデアはありますか?