报告从COM / STA线程到WPF UI线程的进度

时间:2012-11-05 21:48:31

标签: c# wpf com sta acrobat-sdk

我正在开发一个使用COM和Acrobat SDK打印PDF的应用程序。该应用程序是用C#,WPF编写的,我试图弄清楚如何在单独的线程上正确运行打印。我已经看到BackgroundWorker使用线程池,因此不能设置为STA。我知道如何创建STA线程,但我不确定如何从STA线程报告进度:

Thread thread = new Thread(PrintMethod);
thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA
thread.Start(); 
thread.Join(); //Wait for the thread to end

如何在这样创建的STA线程中向WPF ViewModel报告进度?

1 个答案:

答案 0 :(得分:3)

实际上不是,您需要报告进度不是,而是(已经存在的)STA线程,其中UI运行。

您可以通过BackgroundWorker函数实现此目的(ReportProgress在启动BackgroundWorker的线程上提供 - 这应该是您的UI线程),或者使用UI线程{ {1}}(通常使用Dispatcher)。


编辑:
对于您的情况,具有Dispatcher.BeginInvoke的解决方案将不起作用,因为其线程不是STA。所以你需要只使用通常的BackgroundWorker

DispatcherlInvoke

如果您当前的对象没有// in UI thread: Thread thread = new Thread(PrintMethod); thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA thread.Start(); void PrintMethod() // runs in print thread { // do something ReportProgress(0.5); // do something more ReportProgress(1.0); } void ReportProgress(double p) // runs in print thread { var d = this.Dispatcher; d.BeginInvoke((Action)(() => { SetProgressValue(p); })); } void SetProgressValue(double p) // runs in UI thread { label.Content = string.Format("{0}% ready", p * 100.0); } ,您可以从UI对象或视图模型中获取它(如果您使用的话)。