【发布时间】:2012-05-26 02:58:18
【问题描述】:
我目前正在编写一个与 I/O 设备交互的程序,并且需要一种每隔 x 秒轮询一次设备的方法,以检查输入/输出连接。为此,我使用了一个按钮,该按钮使用计时器和计时器事件句柄创建了一个线程来进行轮询。但是,我注意到在任务管理器中,随着时间的流逝,它正在慢慢消耗更多的内存。以下是(我认为)与我的问题相关的一些 sn-ps 代码。
创建线程按钮:
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(); 中使用的匿名委托,有人有什么想法吗?
【问题讨论】:
-
你确定不是GC没有运行?
-
你确定你有内存泄漏吗?也许 GC 还没有运行,所以没有理由恐慌。
-
这与推测的内存泄漏无关,但是为什么要启动一个新线程只是为了启动一个计时器呢?无论如何,一旦创建计时器,线程似乎就结束了。
-
GC 多久运行一次...?我们在谈分钟吗?我会让它运行 10 分钟,看看会发生什么。
-
System.Timers.Timer 默认启动自己的线程。您当前的代码启动一个线程,该线程启动一个线程。你到底做了多少调试?我向您保证 System.Timers.Timer 中没有内存泄漏,至少不是您认为您可能发现的。
标签: c# memory delegates timer memory-leaks