此方法调用位于派生自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是在其他地方吗?那可能是什么原因?
答案 0 :(得分:4)
TL; DR:您必须在UI线程中创建此DispatcherObject
,而不是在工作者中创建。{/ p>
您正在编组操作的
DispatcherObject.Dispatcher
在对象构造时设置为Dispatcher.CurrentDispatcher
。如果未在现有UI线程内创建对象,则CurrentDispatcher
的记录行为是创建与该线程关联的新调度程序对象。稍后,Invoke
尝试封送对该线程(不是STA)的调用,从而导致错误。
答案 1 :(得分:3)
使用从DispatcherObject
派生的类是不够的。您必须使用从XAML创建的现有Dispatcher
中的UIElement
(或者至少确保从GUI线程中创建您的类,并选择正确的Dispatcher
)。