C# 持续触发的计时器是否会导致内存泄漏?

C# 持续触发的计时器是否会导致内存泄漏?,c#,C#,在我的程序中,如果我无法连接到数据库,我会将数据写入文件,并且我有一个单独的线程,该线程有一个计时器,每25秒检查一次连接可用性,如果可以连接,它会将数据从文件传输到主数据库并删除文件。 问题是我从不停止这个计时器,这会导致内存泄漏吗? 如果我只是运行我的程序并监视任务管理器,我可以看到内存使用量不断增加,如果我禁用计时器,然后运行我的应用程序,那么内存是稳定的 public BackgroundWorker() { _backgroundWorkerThread

在我的程序中,如果我无法连接到数据库,我会将数据写入文件,并且我有一个单独的线程,该线程有一个计时器,每25秒检查一次连接可用性,如果可以连接,它会将数据从文件传输到主数据库并删除文件。 问题是我从不停止这个计时器,这会导致内存泄漏吗? 如果我只是运行我的程序并监视任务管理器,我可以看到内存使用量不断增加,如果我禁用计时器,然后运行我的应用程序,那么内存是稳定的

    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);
    }