C# WPF多线程UI-用户控件

C# WPF多线程UI-用户控件,c#,wpf,multithreading,composite,C#,Wpf,Multithreading,Composite,我看到了WPF中使用多个窗口的多线程UI的一些代码示例,其中每个窗口都在自己的UI线程上运行。不过我很好奇——有没有办法通过嵌入式控件来实现这一点 例如,假设在Window1中嵌入了usercontrol1和usercontrol2。Usercontrol1开始旋转并阻塞主UI线程。窗口和用户控件2将生效。即使usercontrol1阻塞,Window1+usercontrol2仍有响应,有没有办法做到这一点 让我们假设我们不控制usercontrol1的开发人员-因此我们不能告诉他们让他们的控

我看到了WPF中使用多个窗口的多线程UI的一些代码示例,其中每个窗口都在自己的UI线程上运行。不过我很好奇——有没有办法通过嵌入式控件来实现这一点

例如,假设在Window1中嵌入了usercontrol1和usercontrol2。Usercontrol1开始旋转并阻塞主UI线程。窗口和用户控件2将生效。即使usercontrol1阻塞,Window1+usercontrol2仍有响应,有没有办法做到这一点

让我们假设我们不控制usercontrol1的开发人员-因此我们不能告诉他们让他们的控件正常工作

我们还假设usercontrol1+2之间的数据交换是必须的

我是否应该探索类似于AddIn的东西?

您不能在另一个线程上“运行”控件(与Winforms一样,控件本身必须创建并在与顶级父线程相同的线程上运行),但是没有什么可以阻止您从用户控件在另一个线程上启动操作。您只需确保使用
Dispatcher
调用对控件本身有直接影响的任何操作。不过,幕后处理可以完全在另一个线程上完成;只是UI的物理更新必须通过
调度程序调用

编辑:问题被编辑后,不,无法将特定组件执行的所有“工作”移动到另一个线程。如果您无法控制所讨论组件的开发,那么您将受开发人员的摆布,由开发人员决定执行代码。

您不能在另一个线程上“运行”控件(与Winforms一样,控件本身必须创建并在与顶级父线程相同的线程上运行),但是没有什么可以阻止您从用户控件在另一个线程上启动操作。您只需确保使用
Dispatcher
调用对控件本身有直接影响的任何操作。不过,幕后处理可以完全在另一个线程上完成;只是UI的物理更新必须通过
调度程序调用


编辑:问题被编辑后,不,无法将特定组件执行的所有“工作”移动到另一个线程。如果您无法控制所讨论组件的开发,那么您将受开发人员的摆布,他将决定在哪里执行代码。

因为在顶部,您有继承自的visual()。它被设计为STA线程模型,其中单个线程访问对象的方法和属性

这就是为什么这两个控件必须在与Window相同的线程中创建


如果您需要在控件之间交换数据,而不是控制这些控件的开发人员,我会考虑使用PrISM或其他MVVM框架。在prism中,基本上是订阅者-发布者模式,您的UserControl1可以发布某些内容,如果订阅了,另一个将收到该内容。

因为在顶部,您有继承自的visual()。它被设计为STA线程模型,其中单个线程访问对象的方法和属性

这就是为什么这两个控件必须在与Window相同的线程中创建


如果您需要在控件之间交换数据,而不是控制这些控件的开发人员,我会考虑使用PrISM或其他MVVM框架。在prism中,基本上是订阅者-发布者模式,您的UserControl1可以发布某些内容,如果订阅了,另一个将收到该内容。

这与位于不同appdomain中的加载项如何工作?是否需要评论原因?就我所知,这是一个正确的答案。@Dr.HappyPants:我不知道你的意思;您是在谈论与另一个AppDomain中运行的东西通信吗?你能举一个更具体的例子来说明你的意思吗?我对细节不太清楚,所以请耐心听我说:这是一种将wpf加载项隔离到不同AppDomain的机制。我只是好奇这和你上面的帖子有什么关系(如果有的话)。不幸的是,虽然你的答案最终可能是正确的,但这无助于我前进。在这个例子中,我不能告诉usercontrol1在UI线程上做得更少,很可能它们是一个恶意控件或恶意插件。在某种程度上,我试图理解的是,在WPF中是否可以使用类似Google Chrome的架构。例如,如果页面旋转失控或在Google Chrome中崩溃,您的其他选项卡将不受影响。我正在尝试实现这样一个外接程序模型,在这个模型中,我可以加载第三方控件,但可以确保核心应用程序不会出现错误行为。这如何与位于不同appdomain中的外接程序协同工作?请评论原因?就我所知,这是一个正确的答案。@Dr.HappyPants:我不知道你的意思;您是在谈论与另一个AppDomain中运行的东西通信吗?你能举一个更具体的例子来说明你的意思吗?我对细节不太清楚,所以请耐心听我说:这是一种将wpf加载项隔离到不同AppDomain的机制。我只是好奇这和你上面的帖子有什么关系(如果有的话)。不幸的是,虽然你的答案最终可能是正确的,但这无助于我前进。在这个例子中,我不能告诉usercontrol1在UI线程上做得更少,很可能它们是一个恶意控件或恶意插件。在某种程度上,我试图理解的是,在WPF中是否可以使用类似Google Chrome的架构。例如,如果页面旋转失控或在Google Chrome中崩溃,您的其他选项卡将不受影响。我正在尝试实现这样一个插件模型,我可以加载第三方控件,但保留核心应用程序