为什么我通过调度程序调用'The calling thread must be 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线程调用它,也就是STA?

我在这里缺少了什么?如何修复?或者这应该在一般情况下工作,而bug在其他地方?那是什么原因呢?

TL;DR:您必须在UI线程中创建这个DispatcherObject,而不是在工作线程中。

将操作编组到的DispatcherObject.Dispatcher在构造对象时设置为Dispatcher.CurrentDispatcher。如果对象不是在现有的UI线程内创建的,那么CurrentDispatcher的文档行为就是创建一个与该线程相关联的新调度程序对象。稍后,Invoke尝试封送对该线程(不是STA)的调用,从而导致错误。

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

相关内容

最新更新