2011-12-14 24 views
0

我正在开发一个程序,接收一些数据,并在处理后我要打印它。它应该是自动打印。数据被添加为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.任何其他设计想法将不胜感激。

+0

正如一张纸条:在许多环境中这是一个可怕的想法。我相信你有你的理由,但是无论何时,当应用程序决定利用(阅读:浪费)公司资源而无需人为干预时,你应该三思。 – 2011-12-14 06:10:13

回答

1

在您的后台工作者中,您可以调用AutomaticPrintA4Delegate。此方法切换到UI线程与

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

所以打印输出运行在UI线程,这就是为什么你的用户界面是“挂”。