Reputation: 47995
I've such a code:
class Engine
{
private static Thread f_thread;
private static System.Timers.Timer timeWatch;
public static void Start()
{
try
{
timeWatch = new System.Timers.Timer(30000);
timeWatch.Elapsed += FolderMonitor;
timeWatch.AutoReset = true;
timeWatch.Enabled = true;
}
catch (Exception ex)
{
// catch error
}
}
public static void FolderMonitor(object source, ElapsedEventArgs e)
{
f_thread = new Thread(FileScan);
f_thread.Start();
}
public static void FileScan()
{
if (timeWatch != null)
{
timeWatch.Stop();
}
try
{
// some operations
}
catch (Exception ex)
{
// catch error
}
timeWatch.Start();
}
}
on a .NET Core 2.2 Windows Service that run on a remote machine. If I check the memory after 1 week of running, it constantly grow up.
It seems it doesn't free the memory allocated by thread (some sort of memory leaks).
But also if I do "nothing" within the thread's FileScan function, it grow up (lesser, but id does). What is happening? Shouldn't GC free it up automatically?
Upvotes: 0
Views: 125
Reputation: 116
Static objects and variables belonging to those object (i.e. the thread you create and run) don't get garbage collected in C#.
For the thread to be garbage collected, it must belong to a non-static object, must be stopped and all the references cleared (mythread = null).
I've had the same problem using threads, writing an audio streaming dedicated server in C#.
When i discovered the leak, i had to re-think and re-write a big part of the code. :)
Upvotes: 1