【问题标题】:How to access c# WPF control in thread safe way?如何以线程安全的方式访问 c# WPF 控件?
【发布时间】:2009-08-16 10:54:27
【问题描述】:

我已经尝试使用 MSDN 中的示例,但它们似乎只适用于 Windows 窗体。例如使用 .InvokeRequired 的方法依赖于 windows 窗体控件,但是该方法不适用于 WPF 控件。 Backgound worker 方法也会抛出一个InvalidOperationException -

调用线程不能访问这个 对象,因为不同的线程拥有 它。

那么如何在 WPF 的上下文中做到这一点呢?

【问题讨论】:

    标签: c# wpf thread-safety


    【解决方案1】:

    您只想使用 Dispatcher.Invoke 方法(或异步等效的 Dispatcher.BeginInvoke),它将封送对主 WPF UI 线程的调用。

    DependencyObject 类包含一个Dispatcher 属性,这意味着从该类继承的所有控件和其他对象也提供此属性,其方式类似于 WinForms。此外,Application 对象提供对调度程序的访问。

    一个示例用法可能如下(在Window/UserControl 的代码隐藏中):

    this.Dispatcher.Invoke((Action)(() =>
        {
            ...
        }));
    

    【讨论】:

    • 谢谢,效果很好。当你知道你需要做什么时,它实际上在 WPF 中看起来比 win 表单简单得多;-)
    • 没问题。是的,WPF 确实有更好的线程/消息泵模型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2015-12-30
    相关资源
    最近更新 更多