.NET中的事件和多线程代码

时间:2009-12-22 00:54:36

标签: c# .net events invoke invokerequired

项目是C#。

所以我有一堆多线程代码,旨在作为库运行。它来自UI的单独项目。

我的图书馆有一个中心对象,需要在创建触发事件的任何内容之前创建。

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

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

3 个答案:

答案 0 :(得分:9)

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

如果你这样做,当你需要举起一个事件时,你可以使用SyncrhonizationContext.Post在UI线程上“调用”该事件。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您是否看过FacadeProxyFactorySingleton模式?

如果您将核心对象实现为Singleton,并提供代理和工厂方法来生成并将这些方法传递给库的调用者,这将变得非常简单。 Facade模式可以通过抽象掉后端正在发生的大部分内部结构来简化这一过程。

组合Factory和Singleton,并确保所有要暴露的类具有需要主对象的构造函数是强制执行此设计的好方法。我不知道你的图书馆的主要要求/设计,所以我不确定这是否适合你。