调用线程无法访问此对象,因为另一个线程拥有它。调度员不工作

时间:2016-05-01 22:44:18

标签: c# multithreading exception dispatcher

好的,这是一个非常常见的问题:

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项目相关的图书馆工作,但我认为这不重要。

2 个答案:

答案 0 :(得分:2)

好的我已经得到了解决方案,我很高兴,因为它是一个可以在其他时间使用的一般解决方案,也许对其他人有用。 我使用调度程序解决了问题,而不是导致异常的指令,而是回到堆栈中,应用调度程序并查看是否能解决问题。

因此,在我的情况下,我必须将调度程序应用于包含导致异常的上述指令的整个例程。

答案 1 :(得分:0)

看来您的问题是Dispatcher.CurrentDispatcher返回当前线程的调度程序(或者为此线程创建,请参阅msdn page)。您可能希望将调度程序用于UI线程。

  • 如果您使用的是WPF,那么最简单的方法是获取对WPF Control的引用并使用其Dispatcher属性,该属性应该是UI线程的调度程序。 / p>

  • 在WinForms中,我建议使用Invoke:winFormsControl.Invoke((Action)(() => { ... }));。与Dispatcher类似,您可以使用BeginInvoke异步运行它。