2010-04-12 75 views
1

我想從c#應用程序中打印一個html頁面,但是在後臺線程上,因爲如果我在主線程上打印文檔,UI會凍結幾秒鐘,我不希望這樣。在後臺線程上打印

我已經嘗試過WebBrowser控件,但它需要託管在某種形式上才能正常工作。託管此控件仍然可以接受,但Print方法需要從創建控件的同一個線程中調用。我嘗試從其他線程調用WebBrowser的Print方法,但它既不工作也不提供任何錯誤/異常。我也嘗試過InternetExplorerClass,但它啓動iexplorer.exe並花費太多時間。

有沒有其他方法可以在不同的(非UI)線程上打印html頁面?

回答

0

這樣的事情不行嗎? ((MethodInvoker)delegate {webBrowser1.Print();});}};}};}};}}

1

我會爲此使用backgroundworker - 因爲你已經有了winform和everthing。 將後臺工作人員和網頁瀏覽器拖到窗體中,然後可以使用以下代碼(當打印實際上被假脫機時,UI凍結幾毫秒); 我已經使用測試按鈕(2)進行呼叫;

using System.Threading;

private void button2_Click(object sender, EventArgs e) 
    { 
     if (!this.backgroundWorker1.IsBusy) 
     { 
      this.backgroundWorker1.RunWorkerAsync("http://www.stackoverflow.com/"); 
     } 
     else 
     { 
      MessageBox.Show("Already working on that piece of paper!"); 
     } 
    } 
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     this.webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); 
     this.webBrowser1.Navigate((string)e.Argument); 
     //-- only when you need to read very bulky pages: Thread.Sleep(1000); 
     e.Result = true; 
    } 
    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     this.webBrowser1.Print(); 
    } 
    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     this.webBrowser1.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); 
    } 
+0

此代碼包含添加和刪除文檔完成事件處理程序之間的爭用條件。這就是爲什麼你需要Thread.Sleep(1000)。 Print方法是不是仍然在主線程上運行,而不是在後臺工作器上運行? – Asher 2010-04-12 08:32:34

+0

我第一次遇到一些延遲。從第二次起,它按預期工作。 有什麼方法可以減少/消除延遲? – Ram 2010-04-12 09:19:33