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

The calling thread cannot access this object because a different thread owns it. DISPATCHER NOT working

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

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

您的问题似乎是 Dispatcher.CurrentDispatcher returns 当前线程的调度程序(或为此线程创建 on,请参阅 msdn page)。您可能想为 UI 线程使用调度程序。

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

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

好的,我找到了解决方案,我对此感到非常高兴,因为它是一个通用的解决方案,可以在其他时候使用,也许对其他人有用。 我使用调度程序解决了问题,不是在导致异常的指令上,而是返回堆栈,应用调度程序并查看是否解决了问题。

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