在背景线程上打印

时间:2010-04-12 05:03:19

标签: c# .net

我想从c#应用程序打印一个html页面,但是在后台线程上,因为如果我在主线程UI上打印文档冻结几秒钟而且我不想要那个。

我尝试过WebBrowser控件,但需要在某种形式上托管才能使其工作。托管此控件仍然可以接受,但需要从创建控件的同一线程调用Print方法。我尝试从其他线程调用WebBrowser的Print方法,但它既不工作也不给出任何错误/异常。我也尝试过InternetExplorerClass,但启动iexplorer.exe并花费太多时间。

有没有其他方法可以在不同的(非UI)线程上打印html页面?

2 个答案:

答案 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();});