J'ai un petit problème avec la gestion de la mémoire dans un service Windows écrit en C# (framework 3.5, visual studio 2008). Le service fonctionne bien, avec une minuterie et un rappel, la procédure est lancée toutes les 3 minutes. Par conséquent, la mémoire dans le Gestionnaire des tâches Windows augmente lentement à chaque exécution de la minuterie.Problème de service C# windows avec mémoire (fuite de mémoire?)
Avez-vous une idée de comment résoudre ce problème?
Pour simplifier le problème, ci-dessous est un code très simple qui exibits le même problème:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.IO;
namespace svcTest
{
public partial class svcTest : ServiceBase
{
private Timer tmr;
private TimerCallback tmrCallBack;
public svcTest()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
FileStream fs = new FileStream(@"c:\svclog.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter m_streamWriter = new StreamWriter(fs);
m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
m_streamWriter.WriteLine("Service Started on " + DateTime.Now.ToLongDateString() + " at " + DateTime.Now.ToLongTimeString());
m_streamWriter.WriteLine(" *----------------*");
m_streamWriter.Flush();
m_streamWriter.Close();
tmrCallBack = new TimerCallback(goEXE);
tmr = new Timer(tmrCallBack, null, 0, 1000 * 60 * 1/2);
}
protected override void OnStop()
{
FileStream fs = new FileStream(@"c:\svclog.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter m_streamWriter = new StreamWriter(fs);
m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
m_streamWriter.WriteLine("Service Stopped on " + DateTime.Now.ToLongDateString() + " at " + DateTime.Now.ToLongTimeString());
m_streamWriter.WriteLine(" *----------------*");
m_streamWriter.Flush();
m_streamWriter.Close();
tmr.Dispose();
}
private void goEXE(Object state)
{
Console.WriteLine(DateTime.Now.ToString());
FileStream fs = new FileStream(@"c:\svclog.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter m_streamWriter = new StreamWriter(fs);
m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
m_streamWriter.WriteLine("Service running on " + DateTime.Now.ToLongDateString() + " at " + DateTime.Now.ToLongTimeString());
m_streamWriter.WriteLine(" *----------------*");
m_streamWriter.Flush();
m_streamWriter.Close();
}
}
}
Toute aide sera appréciée!
stefano
private void goEXE (Object state) { ... même code comme ci-dessus ... m_streamWriter.Dispose(); fs.Dispose(); } – stexcec
Nice vient de réparer une fuite de mémoire en utilisant un StreamWriter! THX! – Moss
Pourquoi l'utilisation imbriquée sur StreamWriter? J'ai cherché autour mais je ne vois pas une réponse. – GaTechThomas