markzzz
markzzz

Reputation: 47995

why creating these threads don't free memory?

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

Answers (1)

Davide C
Davide C

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

Related Questions