2011-12-14 8 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

メモ:これは多くの環境ではひどい考えです。しかし、アプリケーションが人間の介入なしに(読み込み:無駄な)会社のリソースを利用することを決めるときはいつでも、2度考えなければならない理由があると確信しています。 –

+0

それは私のユーザー要求でした、私はそれを否定できません。 – armin

答えて

1

バックグラウンドワーカーでは、AutomaticPrintA4Delegateを呼び出します。この方法は、だから、プリントアウトは、UIスレッドで実行されていて、それがあなたのUIが「ハング」する理由、ある

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

でUIスレッドに切り替わります。