2011-12-14 47 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線程,這就是爲什麼你的用戶界面是「掛」。