rdvojmoc / DinkToPdf

C# .NET Core wrapper for wkhtmltopdf library that uses Webkit engine to convert HTML pages to PDF.
MIT License
1.09k stars 416 forks source link

StopThread() cannot stop the newly opened background thread, resulting in unlimited thread growth and eventually breaking the Linux system limit. #186

Open hkszlq opened 4 months ago

hkszlq commented 4 months ago

in src/DinkToPdf/SynchronizedConverter.cs

private void StopThread() { lock (startLock) { if (conversionThread != null) { kill = true; while (conversionThread.ThreadState == ThreadState.Stopped) { } conversionThread = null; } } }

 private void StartThread()
    {
        lock (startLock)
        {
            if (conversionThread == null)
            {
                conversionThread = new Thread(**Run**)
                {
                    IsBackground = true,
                    Name = "wkhtmltopdf worker thread"
                };

                kill = false;

                conversionThread.Start();
            }
        }
    }

private void Run() { while (!kill) { //get next conversion taks from blocking collection Task task = conversions.Take();

            lock (task)
            {
                //run taks on thread that called RunSynchronously method
                task.RunSynchronously();

                //notify caller thread that task is completed
                Monitor.Pulse(task);
            }
        }
    }