如何用后台线程实现自动打印?

时间:2011-12-14 06:05:58

标签: c# multithreading

我正在开发一个接收一些数据的程序,在处理之后我想打印它。它应该是自动打印。数据作为记录添加到printList队列。然后一个线程应该逐个打印它们。这是代码:

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);
        }
    }

单击按钮可控制自动打印变量。 rwl控制对自动打印的访问,rwlprintlist控制对printList的访问。 但每当我开始这个帖子时,我的主要gui就会挂起。我不知道为什么?

P.S。任何其他设计理念将不胜感激。

1 个答案:

答案 0 :(得分:1)

在后台工作人员中,您可以调用AutomaticPrintA4Delegate。此方法使用

切换到UI线程
if (this.InvokeRequired)                 
    this.Invoke(new MethodInvoker(AutomaticPrintA4Delegate)); 

因此打印输出正在UI线程中运行,这就是为什么你的UI“挂起”的原因。