我正在开发一个使用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报告进度?
答案 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对象或视图模型中获取它(如果您使用的话)。