0

项目是 C#。

所以我有一堆设计为作为库运行的多线程代码。它与 UI 位于一个单独的项目中。

我的库有一个中心对象,需要在创建任何会触发事件的东西之前创建它。

这个主对象是否可以在某些对象中传递,以便我的事件可以确定何时需要调用它们以返回主 UI 线程?

我真的很想让 UI 不必进行大量调用,因为他的事件处理程序几乎总是会从某个随机后台线程中调用。

4

3 回答 3

9

根据您的描述,您最好的选择可能是让您的所有对象都将SynchronizationContext作为其构造函数中的参数。

如果这样做,当您需要引发事件时,可以使用SyncrhonizationContext.Post在 UI 线程上“调用”事件。

这样,您的库将与 UI 无关(可以在 Windows 窗体或 WPF 中工作),并且您可以根据需要在 UI 线程上引发事件。

您的库的用户只需使用SynchronizationContext.Current创建您的对象(它为您提供 Windows 窗体和 WPF 应用程序中的有效上下文,而无需引用任何一个)。

于 2009-12-22T01:03:30.220 回答
0

使用计时器或响应事件,UI 线程(或线程上的数据绑定对象)可以轮询“状态”对象并限制 UI 必须执行的工作量。

于 2009-12-22T01:02:48.053 回答
0

你看过FacadeProxyFactorySingleton模式吗?

如果您将核心对象实现为单例,并提供代理和工厂方法来生成这些对象并将其交付给库的调用者,这将变得相当简单。外观模式可以通过抽象出后端发生的大部分内部结构来使这更容易。

结合 Factory 和 Singleton,并确保您想要公开的所有类都具有需要您的主对象的构造函数,这是实施这种设计的好方法。我不知道您图书馆的主要要求/设计,所以我不确定这是否适合您。

于 2009-12-22T01:16:53.237 回答