【问题标题】:How to create a WPF user control in separate STA thread and use it in main thread?如何在单独的 STA 线程中创建 WPF 用户控件并在主线程中使用它?
【发布时间】:2015-02-26 14:25:16
【问题描述】:

我正在尝试创建一个启动时间过长的 WPF 用户控件。因此,我想在单独的 STA 线程中创建用户控件,并将其添加到主 UI 线程的 StackPanel 中。但是,它不允许,因为用户控件是在单独的线程中创建的。感谢专家的帮助!谢谢。

【问题讨论】:

  • 可以做到(参见其他链接),但如果可能的话,最好不要这样做。你知道是什么让它变慢了吗?通常(特别是如果它连接到外部数据,或者如果有某种昂贵的计算,例如),您可以将慢速部分与 UI 本身分离,并在单独的线程中运行慢速部分。请记住,以这种方式使用线程不会使其更快(除非您在多核机器上使用多个线程),但它会在计算发生时保持 UI 响应。
  • 就我而言,上述 WPF 用户控件正在加载第三方视频插件,不再控制第三方插件。事实上,该视频插件需要很长时间才能启动。如果我使用 HostVisual 技术,我只能显示控件,但它不允许访问任何子控件。

标签: c# wpf multithreading


【解决方案1】:

由于自定义控件正在执行该过程,因此请在单独的线程上执行该过程。创建一个内部 INotifyProperty 属性,因为一开始的可见性标志是不可见的。当这个过程完成后,让它改变标志,控件在堆栈面板中变得可见,一切都很好。

这是处理长时间运行操作的标准做法,远离 gui 并且不必处理 STA 线程问题。

【讨论】:

  • 感谢您的回复。自定义控件需要很长时间才能启动,它是第三方控件。所以,我必须在单独的 STA 线程中启动控制。正如您所说,我们可以将单独的非 STA 线程用于长时间运行的进程,但不能用于启动 UI 元素。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
相关资源
最近更新 更多