2010-04-12 80 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