尽管通过Dispatcher调用,为什么我会得到'调用线程必须是STA'异常?

时间:2013-12-03 16:14:32

标签: wpf dispatcher sta

此方法调用位于派生自DispatcherObject

的类中
Dispatcher.Invoke(DispatcherPriority.Input, new ThreadStart(() =>
            {
                var exported = formatProvider.Export(original.Workbook);
                Workbook = formatProvider.Import(exported);
            }));

该类的方法由后台工作者在其DoWork委托中调用。

工作簿是 Telerik的工作簿,由RadSpreadsheetControl使用。显然,工作簿只能由UI线程访问。

以上代码抛出InvalidOperationException,说

  

调用线程必须是STA,因为许多UI组件都需要   此

我真的不明白,因为我认为在使用Dispatcher调用动作时,我会从UI Thread调用它,这是STA吗?

我在这里缺少什么以及如何解决这个问题?或者这应该是一般的,而bug是在其他地方吗?那可能是什么原因?

2 个答案:

答案 0 :(得分:4)

TL; DR:您必须在UI线程中创建此DispatcherObject,而不是在工作者中创建。{/ p> 您正在编组操作的

DispatcherObject.Dispatcher在对象构造时设置为Dispatcher.CurrentDispatcher。如果未在现有UI线程内创建对象,则CurrentDispatcher的记录行为是创建与该线程关联的新调度程序对象。稍后,Invoke尝试封送对该线程(不是STA)的调用,从而导致错误。

答案 1 :(得分:3)

使用从DispatcherObject派生的类是不够的。您必须使用从XAML创建的现有Dispatcher中的UIElement(或者至少确保从GUI线程中创建您的类,并选择正确的Dispatcher)。