此方法调用位于从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线程调用它,也就是STA?
我在这里缺少了什么?如何修复?或者这应该在一般情况下工作,而bug在其他地方?那是什么原因呢?
TL;DR:您必须在UI线程中创建这个DispatcherObject
,而不是在工作线程中。
将操作编组到的DispatcherObject.Dispatcher
在构造对象时设置为Dispatcher.CurrentDispatcher
。如果对象不是在现有的UI线程内创建的,那么CurrentDispatcher
的文档行为就是创建一个与该线程相关联的新调度程序对象。稍后,Invoke
尝试封送对该线程(不是STA)的调用,从而导致错误。
仅使用从DispatcherObject
派生的类是不够的。必须使用从XAML创建的现有UIElement
中的Dispatcher
(或者至少确保从GUI线程内部创建类,在该线程中它会选择正确的Dispatcher
)。