Frequently asked questions about multithreading in Word to PDF

9 Dec 202422 minutes to read

The frequently asked questions regarding multithreading and thread-safety support in Word to PDF conversion are listed below.

Does the Word library support multithreading and thread-safety for Word to PDF conversion?

Yes, the Syncfusion® Word library is thread-safe, and you can create multiple instances of the WordDocument class to load the same file as multiple copies or different Word files, then convert them to PDF using multithreading in C#.

Multithreaded Word to PDF using tasks

The following code example illustrates how to use multithreading to convert multiple copies of a Word document to PDF by creating multiple tasks in C#.

class MultiThreading
{
    //Indicates the number of threads to be create.
    private const int TaskCount = 1000;
    public static async Task Main()
    {
        //Create an array of tasks based on the TaskCount.
        Task[] tasks = new Task[TaskCount];
        for (int i = 0; i < TaskCount; i++)
        {
            tasks[i] = Task.Run(() => ConvertWordToPDF());
        }
        //Ensure all tasks complete by waiting on each task.
        await Task.WhenAll(tasks);
    }

    //Convert a Word document to PDF using multi-threading.
    static void ConvertWordToPDF()
    {
        using (FileStream inputStream = new FileStream("Input.docx", FileMode.Open, FileAccess.Read))
        {
            //Load an existing Word document.
            using (WordDocument document = new WordDocument(inputStream, FormatType.Docx))
            {
                //Create an instance of DocIORenderer.
                using (DocIORenderer renderer = new DocIORenderer())
                {
                    //Convert Word document to PDF.
                    using (PdfDocument pdfDocument = renderer.ConvertToPDF(document))
                    {
                        //Save the PDF document.
                        using (FileStream outputFileStream = new FileStream("Output" + Guid.NewGuid().ToString() +".pdf", FileMode.Create, FileAccess.Write))
                        {
                            pdfDocument.Save(outputFileStream);
                        }
                    }
                }
            }
        }
    }
}
class MultiThreading
{
    //Indicates the number of threads to be create.
    private const int TaskCount = 1000;
    public static async Task Main()
    {
        //Create an array of tasks based on the TaskCount.
        Task[] tasks = new Task[TaskCount];
        for (int i = 0; i < TaskCount; i++)
        {
            tasks[i] = Task.Run(() => ConvertWordToPDF());
        }
        //Ensure all tasks complete by waiting on each task.
        await Task.WhenAll(tasks);
    }

    //Convert a Word document to PDF using multi-threading.
    static void ConvertWordToPDF()
    {
        using (FileStream inputStream = new FileStream("Input.docx", FileMode.Open, FileAccess.Read))
        {
            //Load an existing Word document.
            using (WordDocument document = new WordDocument(inputStream, FormatType.Docx))
            {
                //Create an instance of DocToPDFConverter.
                using (DocToPDFConverter converter = new DocToPDFConverter())
                {
                    //Convert Word document to PDF.
                    PdfDocument pdfDocument = converter.ConvertToPDF(document);
                    //Save the PDF document.
                    using (FileStream outputFileStream = new FileStream("Output" + Guid.NewGuid().ToString() +".pdf", FileMode.Create, FileAccess.Write))
                    {
                        pdfDocument.Save(outputFileStream);
                    }
                }
            }
        }
    }
}
Module MultiThreading
    'Indicates the number of threads to be create.
    Private Const TaskCount As Integer = 1000
    Public Sub Main()
        'Create an array of tasks based on the TaskCount.
        Dim tasks(TaskCount - 1) As Task
        For i As Integer = 0 To TaskCount - 1
            tasks(i) = Task.Run(Sub() ConvertWordToPDF())
        Next
        'Ensure all tasks complete by waiting on each task.
        Task.WhenAll(tasks).Wait()
    End Sub

    'Convert a Word document to PDF using multi-threading.
    Private Sub ConvertWordToPDF()
        Using inputStream As New FileStream("Input.docx", FileMode.Open, FileAccess.Read, FileShare.Read)
            'Load an existing Word document.
            Using document As New WordDocument(inputStream, FormatType.Docx)
                'Create an instance of DocToPDFConverter.
                Using converter As New DocToPDFConverter()
                    'Convert Word document to PDF.
                    Using pdfDocument As PdfDocument = converter.ConvertToPDF(document)
                        'Save the PDF document.
                        Using outputFileStream As New FileStream("Output" & Guid.NewGuid().ToString() & ".pdf", FileMode.Create, FileAccess.Write)
                            pdfDocument.Save(outputFileStream)
                        End Using
                    End Using
                End Using
            End Using
        End Using
    End Sub
End Module

You can download a complete working sample from GitHub.

Multithreaded Word to PDF using parallel process

The following code example illustrates how to use a parallel for loop to process multiple tasks concurrently, converting Word documents to PDF using multithreading in C#.

class MultiThreading
{
    static void Main(string[] args)
    {
        //Indicates the number of threads to be create.
        int limit = 5;
        Console.WriteLine("Parallel For Loop");
        Parallel.For(0, limit, count =>
        {
            Console.WriteLine("Task {0} started", count);
            //Convert multiple Word document, one document on each thread.
            ConvertWordToPDF(count);
            Console.WriteLine("Task {0} is done", count);
        });
    }

    //Convert a Word document to PDF using multi-threading.
    static void ConvertWordToPDF(int count)
    {
        using (FileStream inputStream = new FileStream("Input.docx", FileMode.Open, FileAccess.Read))
        {
            //Load an existing Word document.
            using (WordDocument document = new WordDocument(inputStream, FormatType.Docx))
            {
                //Create an instance of DocIORenderer.
                using (DocIORenderer renderer = new DocIORenderer())
                {
                    //Convert Word document to PDF.
                    PdfDocument pdfDocument = renderer.ConvertToPDF(document);
                    //Save the PDF document.
                    using (FileStream outputFileStream = new FileStream("Output" + count + ".pdf", FileMode.Create, FileAccess.Write))
                    {
                        pdfDocument.Save(outputFileStream);
                    }
                    // Dispose pdf to free resources.
                    pdfDocument.Dispose();
                }
            }
        }
    }
}
class MultiThreading
{
    static void Main(string[] args)
    {
        //Indicates the number of threads to be create.
        int limit = 5;
        Console.WriteLine("Parallel For Loop");
        Parallel.For(0, limit, count =>
        {
            Console.WriteLine("Task {0} started", count);
            //Convert multiple Word document, one document on each thread.
            ConvertWordToPDF(count);
            Console.WriteLine("Task {0} is done", count);
        });
    }

    //Convert a Word document to PDF using multi-threading.
    static void ConvertWordToPDF(int count)
    {
        using (FileStream inputStream = new FileStream("Input.docx", FileMode.Open, FileAccess.Read))
        {
            //Load an existing Word document.
            using (WordDocument document = new WordDocument(inputStream, FormatType.Docx))
            {
                //Create an instance of DocToPDFConverter.
                using (DocToPDFConverter converter = new DocToPDFConverter())
                {
                    //Convert Word document to PDF.
                    using (PdfDocument pdfDocument = converter.ConvertToPDF(document))
                    {
                        //Save the PDF document.
                        using (FileStream outputFileStream = new FileStream("Output" + count + ".pdf", FileMode.Create, FileAccess.Write))
                        {
                            pdfDocument.Save(outputFileStream);
                        }
                    }
                }
            }
        }
    }
}
Module MultiThreading
    Public Sub Main(args As String())
        ' Indicates the number of threads to be create.
        Dim limit As Integer = 5
        Console.WriteLine("Parallel For Loop")
        ' Parallel For Loop
        Parallel.For(0, limit, Sub(count)
                                   Console.WriteLine("Task {0} started", count)
                                   'Convert multiple Word document, one document on each thread.
                                   ConvertWordToPDF(count)
                                   Console.WriteLine("Task {0} is done", count)
                               End Sub)
    End Sub

    ' Convert multiple Word document to PDF using multi-threading.
    Private Sub ConvertWordToPDF(count As Integer)
        Using inputStream As New FileStream("Input.docx", FileMode.Open, FileAccess.Read)
            'Load an existing Word document.
            Using document As New WordDocument(inputStream, FormatType.Docx)
                'Create an instance of DocToPDFConverter.
                Using converter As New DocToPDFConverter()
                    'Convert Word document to PDF.
                    Using pdfDocument As PdfDocument = converter.ConvertToPDF(document)
                        'Save the PDF document.
                        Using outputFileStream As New FileStream("Output" & count.ToString() & ".pdf", FileMode.Create, FileAccess.Write)
                            pdfDocument.Save(outputFileStream)
                        End Using
                    End Using
                End Using
            End Using
        End Using
    End Sub
End Module

You can download a complete working sample from GitHub.