我想从c#应用程序打印一个html页面,但是在后台线程上,因为如果我在主线程UI上打印文档冻结几秒钟而且我不想要那个。
我尝试过WebBrowser控件,但需要在某种形式上托管才能使其工作。托管此控件仍然可以接受,但需要从创建控件的同一线程调用Print方法。我尝试从其他线程调用WebBrowser的Print方法,但它既不工作也不给出任何错误/异常。我也尝试过InternetExplorerClass,但启动iexplorer.exe并花费太多时间。
有没有其他方法可以在不同的(非UI)线程上打印html页面?
答案 0 :(得分:1)
我会为此目的使用背景工作者 - 因为你已经获得了winform和everthing。 将后台工作程序和Web浏览器拖到表单中,您可以使用以下代码(实际假脱机打印时,UI冻结毫秒); 我使用了测试按钮(2)进行通话;
使用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);
}
答案 1 :(得分:0)
这样的事情不起作用吗?
webBrowser1.BeginInvoke((MethodInvoker)代表{webBrowser1.Print();});