好的,这是一个非常常见的问题:
imgUser.Source = ocBitmaps[iComboBoxSelectedItem];<---collection of images
这会抛出错误,因为它不在UI线程上运行。另外,如果我添加一个调度程序:
System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke((Action)(() =>imgUser.Source = ocBitmaps[iComboBoxSelectedItem]; }));
它仍然不起作用,如果我使用具有两步版本的调度程序,我会得到相同的结果:
BitmapImage img = ocBitmaps[iComboBoxSelectedItem];
System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke((Action)(() => { imgUser.Source = img; }));
我在这个问题上看到的每个答案似乎都有调度员作为解决方案。为什么它不起作用?
其他信息:我在与MainView项目相关的图书馆工作,但我认为这不重要。
答案 0 :(得分:2)
好的我已经得到了解决方案,我很高兴,因为它是一个可以在其他时间使用的一般解决方案,也许对其他人有用。 我使用调度程序解决了问题,而不是导致异常的指令,而是回到堆栈中,应用调度程序并查看是否能解决问题。
因此,在我的情况下,我必须将调度程序应用于包含导致异常的上述指令的整个例程。
答案 1 :(得分:0)
看来您的问题是Dispatcher.CurrentDispatcher
返回当前线程的调度程序(或者为此线程创建,请参阅msdn page)。您可能希望将调度程序用于UI线程。
如果您使用的是WPF,那么最简单的方法是获取对WPF Control
的引用并使用其Dispatcher
属性,该属性应该是UI线程的调度程序。 / p>
在WinForms中,我建议使用Invoke:winFormsControl.Invoke((Action)(() => { ... }));
。与Dispatcher
类似,您可以使用BeginInvoke
异步运行它。