armin
armin

Reputation: 2025

How to implement automatic printing with background threads?

I'm developing a program that receives some data and after processing I want to print it.It should be automatic printing.The data is added as records to printList queue.Then a thread is supposed to print them one by one.here's the code :

private void button4_Click(object sender, EventArgs e)
    {
        rwl.AcquireWriterLock(10);
        try
        {
            if (automaticPrint == false)
            {
                automaticPrint = true;
                _automaticPrintThread = new Thread(new ThreadStart(AutomaticPrintA4));
                _automaticPrintThread.IsBackground = true;
                _automaticPrintThread.Start();
            }
            else
            {
                automaticPrint = false;
                if (_automaticPrintThread != null)
                {
                    _automaticPrintThread.Join(1);
                }
            }
        }
        finally
        {
            rwl.ReleaseWriterLock();
        }
    }

    private void AutomaticPrintA4()
    {
        try
        {
            this.AutomaticPrintA4Delegate();
        }
        catch (Exception e)
        {
            this._automaticPrintThread.Abort();
            MessageBox.Show(e.StackTrace);
        }
    }

    private void AutomaticPrintA4Delegate()
    {
        try
        {
            if (this.InvokeRequired)
                this.Invoke(new MethodInvoker(AutomaticPrintA4Delegate));
            else
            {
                rwl.AcquireReaderLock(100);
                Telerik.Reporting.Processing.ReportProcessor rp = new Telerik.Reporting.Processing.ReportProcessor();
                System.Drawing.Printing.PrinterSettings ps = new System.Drawing.Printing.PrinterSettings();
                try
                {
                    while (automaticPrint)
                    {
                        rwlprintlist.AcquireReaderLock(10);
                        try
                        {
                            if (Session.printList != null)
                            {
                                if (Session.printList.Count != 0)
                                {
                                    if (Session.printList[0] != null)
                                    {
                                        rp.PrintReport(new Report(Session.printList[0]), ps);
                                        LockCookie lc = rwlprintlist.UpgradeToWriterLock(10);
                                        Session.printList.RemoveAt(0);
                                        rwlprintlist.DowngradeFromWriterLock(ref lc);
                                    }
                                }
                                else
                                {
                                    Thread.Sleep(1000);
                                }
                            }
                            else
                            {
                                Thread.Sleep(1000);
                            }
                        }
                        finally
                        {
                            rwlprintlist.ReleaseReaderLock();
                        }
                    }
                }
                finally
                {
                    rwl.ReleaseReaderLock();
                }
            }
        }
        catch (Exception e)
        {
            MessageBox.Show("Print : " + e.StackTrace + e.Message);
        }
    }

A button click controls automaticprint variable. rwl controls access to automatic print and rwlprintlist controls access to printList. but my main gui hangs whenever I start this thread.I don't know why?

P.S. any other design ideas would be appreciated.

Upvotes: 0

Views: 872

Answers (1)

Fischermaen
Fischermaen

Reputation: 12468

In your background worker you call AutomaticPrintA4Delegate. This method switches to the UI thread with

if (this.InvokeRequired)                 
    this.Invoke(new MethodInvoker(AutomaticPrintA4Delegate)); 

So the print out is running in the UI thread and that is the reason, why your UI is "hanging".

Upvotes: 1

Related Questions