调用线程无法访问此对象,因为另一个线程拥有它。调度员不工作
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
到 运行。
好的,我找到了解决方案,我对此感到非常高兴,因为它是一个通用的解决方案,可以在其他时候使用,也许对其他人有用。
我使用调度程序解决了问题,不是在导致异常的指令上,而是返回堆栈,应用调度程序并查看是否解决了问题。
因此,在我的例子中,我必须将调度程序应用于包含上述导致异常的指令的整个例程。
好的,这是一个很常见的问题:
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
到 运行。
好的,我找到了解决方案,我对此感到非常高兴,因为它是一个通用的解决方案,可以在其他时候使用,也许对其他人有用。 我使用调度程序解决了问题,不是在导致异常的指令上,而是返回堆栈,应用调度程序并查看是否解决了问题。
因此,在我的例子中,我必须将调度程序应用于包含上述导致异常的指令的整个例程。