C# 调用线程无法访问此对象,因为其他线程拥有它。调度员不工作

C# 调用线程无法访问此对象,因为其他线程拥有它。调度员不工作,c#,multithreading,exception,dispatcher,C#,Multithreading,Exception,Dispatcher,这是一个非常常见的问题: imgUser.Source = ocBitmaps[iComboBoxSelectedItem];<---collection of images 它仍然不起作用,如果我在两步版本中使用dispatcher,我会得到相同的结果: BitmapImage img = ocBitmaps[iComboBoxSelectedItem]; System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke((Act

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

imgUser.Source = ocBitmaps[iComboBoxSelectedItem];<---collection of images
它仍然不起作用,如果我在两步版本中使用dispatcher,我会得到相同的结果:

BitmapImage img = ocBitmaps[iComboBoxSelectedItem];
System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke((Action)(() => { imgUser.Source = img; }));
我看到的关于这个问题的每一个答案似乎都有调度员作为解决方案。为什么它在这里不起作用


其他信息:我正在连接到MainView项目的库中工作,但我认为这并不重要。

您的问题似乎是
调度程序。CurrentDispatcher
返回当前线程的调度程序(或为此线程创建on,请参阅)。您可能希望为UI线程使用dispatcher

  • 如果您使用的是WPF,那么最简单的方法就是获取对WPF
    控件的引用,并使用其
    Dispatcher
    属性,该属性应该是UI线程的Dispatcher

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


您的问题似乎是
调度程序。CurrentDispatcher
返回当前线程的调度程序(或为此线程创建on,请参阅)。您可能希望为UI线程使用dispatcher

  • 如果您使用的是WPF,那么最简单的方法就是获取对WPF
    控件的引用,并使用其
    Dispatcher
    属性,该属性应该是UI线程的Dispatcher

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


好的,我已经找到了解决方案,我非常高兴,因为这是一个通用的解决方案,可以在其他时间使用,也许对其他人有用。 我解决了这个问题,在导致异常的指令上使用了dispatcher,但在堆栈中使用了dispatcher,并查看这是否解决了问题


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

好的,我得到了解决方案,我对此非常满意,因为这是一个通用解决方案,可以在其他时间使用,可能对其他人有用。 我解决了这个问题,在导致异常的指令上使用了dispatcher,但在堆栈中使用了dispatcher,并查看这是否解决了问题


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

如果您阅读了我所写的内容,我已经说过我在WPF中,并且正在使用控件上的调度程序,我很抱歉,但是您在我能看到的任何地方都没有提到WPF。您确实提到了Dispatcher,但据我所知,这在WinForms中在技术上也是可行的。此外,未来的观众可能会发现,了解这两种框架的信息很有帮助。最后,您的代码示例似乎都使用了static
Dispatcher.CurrentDispatcher
属性,它不是使用
控件的
Dispatcher
,而是使用当前线程的
Dispatcher
。这不是什么大问题,但据我所知,编程语言除了在标记中之外,其他地方都没有提到。感谢其他infoWPF/WinForms不是语言,而是框架。这两种语言都应该与任何.NET兼容的语言(尽管有些语言更难使用)以及用于WPF的XAML一起使用。简言之,C#(来自标记)没有指定WPF/WinForms,因此我提供了这两个选项以供参考@Patrick是否提供了建议的WPF修复帮助?因此,在非UI线程上使用
Dispatcher.CurrentDispatcher
属性可以防止跨线程异常?如果您阅读了我所写的内容,我已经说过我在WPF中并且正在控件上使用Dispatcher,我很抱歉,但是您在我能看到的任何地方都没有提到WPF。您确实提到了Dispatcher,但据我所知,这在WinForms中在技术上也是可行的。此外,未来的观众可能会发现,了解这两种框架的信息很有帮助。最后,您的代码示例似乎都使用了static
Dispatcher.CurrentDispatcher
属性,它不是使用
控件的
Dispatcher
,而是使用当前线程的
Dispatcher
。这不是什么大问题,但据我所知,编程语言除了在标记中之外,其他地方都没有提到。感谢其他infoWPF/WinForms不是语言,而是框架。这两种语言都应该与任何.NET兼容的语言(尽管有些语言更难使用)以及用于WPF的XAML一起使用。简言之,C#(来自标记)没有指定WPF/WinForms,因此我提供了这两个选项以供参考@Patrick是否提供了建议的WPF修复帮助?因此,在非UI线程上使用
Dispatcher.CurrentDispatcher
属性可以防止跨线程异常?
BitmapImage img = ocBitmaps[iComboBoxSelectedItem];
System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke((Action)(() => { imgUser.Source = img; }));