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
控件的引用,并使用其
属性,该属性应该是UI线程的DispatcherDispatcher
- 在WinForms中,我建议使用Invoke:
winFormsControl.Invoke((操作)(()=>{…}))代码>。与
类似,您可以使用Dispatcher
异步运行它BeginInvoke
调度程序。CurrentDispatcher
返回当前线程的调度程序(或为此线程创建on,请参阅)。您可能希望为UI线程使用dispatcher
- 如果您使用的是WPF,那么最简单的方法就是获取对WPF
控件的引用,并使用其
属性,该属性应该是UI线程的DispatcherDispatcher
- 在WinForms中,我建议使用Invoke:
winFormsControl.Invoke((操作)(()=>{…}))代码>。与
类似,您可以使用Dispatcher
异步运行它BeginInvoke
因此,在我的情况下,我必须将调度程序应用于包含上述导致异常的指令的整个例程。好的,我得到了解决方案,我对此非常满意,因为这是一个通用解决方案,可以在其他时间使用,可能对其他人有用。 我解决了这个问题,在导致异常的指令上使用了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中在技术上也是可行的。此外,未来的观众可能会发现,了解这两种框架的信息很有帮助。最后,您的代码示例似乎都使用了staticDispatcher.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; }));