C# 持续触发的计时器是否会导致内存泄漏?
在我的程序中,如果我无法连接到数据库,我会将数据写入文件,并且我有一个单独的线程,该线程有一个计时器,每25秒检查一次连接可用性,如果可以连接,它会将数据从文件传输到主数据库并删除文件。 问题是我从不停止这个计时器,这会导致内存泄漏吗? 如果我只是运行我的程序并监视任务管理器,我可以看到内存使用量不断增加,如果我禁用计时器,然后运行我的应用程序,那么内存是稳定的C# 持续触发的计时器是否会导致内存泄漏?,c#,C#,在我的程序中,如果我无法连接到数据库,我会将数据写入文件,并且我有一个单独的线程,该线程有一个计时器,每25秒检查一次连接可用性,如果可以连接,它会将数据从文件传输到主数据库并删除文件。 问题是我从不停止这个计时器,这会导致内存泄漏吗? 如果我只是运行我的程序并监视任务管理器,我可以看到内存使用量不断增加,如果我禁用计时器,然后运行我的应用程序,那么内存是稳定的 public BackgroundWorker() { _backgroundWorkerThread
public BackgroundWorker()
{
_backgroundWorkerThread = new Thread(new ThreadStart(ThreadEntryPoint));
_timer = new SWF.Timer();
_timer.Tick += new EventHandler(_timer_Tick);
_timer.Interval = 25 * 1000;
_timer.Enabled = true;
}
void _timer_Tick(object sender, EventArgs e)
{
bool lanAvailabe = NetworkInterface.GetIsNetworkAvailable();
if (lanAvailabe)
{
if (!GetListOfFiles())
{
return;
}
}
else
return;
}
GetListofFiles()的实现
方法读取xml文件
private void ReadXmlFile(string filename)
{
string[] patientInfo = new string[15];
using (StreamReader sr = new StreamReader(filename, Encoding.Default))
{
String line;
line = sr.ReadToEnd();
if (line.IndexOf("<ID>") > 0)
{
patientInfo[0] = GetTagValue(line, "<ID>", "</ID>");
}
if (line.IndexOf("<PatientID>") > 0)
{
patientInfo[1] = GetTagValue(line, "<PatientID>", "</PatientID>");
}
if (line.IndexOf("<PatientName>") > 0)
{
patientInfo[2] = GetTagValue(line, "<PatientName>", "</PatientName>");
}
if (line.IndexOf("<Room>") > 0)
{
patientInfo[3] = GetTagValue(line, "<Room>", "</Room>");
}
}
WriteToDb(patientInfo);
}
private void ReadXmlFile(字符串文件名)
{
字符串[]patientInfo=新字符串[15];
使用(StreamReader sr=new StreamReader(文件名,Encoding.Default))
{
弦线;
line=sr.ReadToEnd();
如果(第行IndexOf(“”>0)
{
patientInfo[0]=GetTagValue(行“,”);
}
如果(第行IndexOf(“”>0)
{
patientInfo[1]=GetTagValue(行,“,”);
}
如果(第行IndexOf(“”>0)
{
patientInfo[2]=GetTagValue(行,“,”);
}
如果(第行IndexOf(“”>0)
{
patientInfo[3]=GetTagValue(行,“,”);
}
}
WriteToDb(patientInfo);
}
如果我只是运行我的程序并监视任务管理器,我可以看到内存使用量不断增加
找一个剖析器。任务管理器不是正确的工具。不知道发生了什么事。这并不意味着你有漏洞。可能只是GC没有运行,因为有足够的空间等。是的,当然,永无止境的计时器可能会导致内存泄漏。但是为了回答您的问题,我们需要了解
GetListOfFiles()
的实现。您能告诉我们SWF名称空间吗?@tia使用SWF=System.Windows.Forms;什么是ReadXmlFile?也许比赛条件很小,如果需要25秒以上的时间来节省db,会发生什么?删除中发生了什么?重复的“插入”会发生什么?如果除了最后一次写入db之外的所有文件都被“_writeto db”会发生什么情况?你还是会删除所有文件吗?@Fredou我还没有包含任何关于竞争条件的内容(我不知道,你能不能提出一些建议),但在插入之前我会检查它是否已经存在,因为这不是我写入主db的唯一方式,并且即将写入db标志,是的,我需要找到一些其他的方法来获得有价值的评论
private void ReadXmlFile(string filename)
{
string[] patientInfo = new string[15];
using (StreamReader sr = new StreamReader(filename, Encoding.Default))
{
String line;
line = sr.ReadToEnd();
if (line.IndexOf("<ID>") > 0)
{
patientInfo[0] = GetTagValue(line, "<ID>", "</ID>");
}
if (line.IndexOf("<PatientID>") > 0)
{
patientInfo[1] = GetTagValue(line, "<PatientID>", "</PatientID>");
}
if (line.IndexOf("<PatientName>") > 0)
{
patientInfo[2] = GetTagValue(line, "<PatientName>", "</PatientName>");
}
if (line.IndexOf("<Room>") > 0)
{
patientInfo[3] = GetTagValue(line, "<Room>", "</Room>");
}
}
WriteToDb(patientInfo);
}