我认为这是一个简单的"问题",我已经找到了几个解决方案,但我不知道哪种方式可以用于C#中的最佳实践.
在应用程序的生命周期中,我有一个主对象(比如一个单例).这个"MasterClass"创建了一堆新类型的对象,每次调用MasterClass.Instance.CreateSlaveObject时都说"SlaveClass".
此MasterClass还监视其他一些对象的状态更改,当发生这种情况时,通知它创建的SlaveClass对象的更改.看起来很简单.
因为我来自本地C++世界,所以我首先使用它来创建一个接口
Interface IChangeEventListener
{
void ChangeHappened();
}
Run Code Online (Sandbox Code Playgroud)
我从中派生出"SlaveClass".然后在我的"MasterClass"中,我有:
...
IList<IChangeEventListener> slaveList;
...
CreateSlaveObject
{
...
slaveList.Add(slave);
}
...
ChangeHappened()
{
...
foreach(var slave in slaveList)
{
slave.ChangeHappened();
}
}
Run Code Online (Sandbox Code Playgroud)
这很有效.但是我一直在想,如果有另一种(更好的)方法可以做到这一点.所以我对这个主题进行了更多研究,并看到了C#事件.
因此,我不是在MasterClass中维护一个奴隶集合,而是将MasterClass注入到SlaveClass的ctor中(或通过一个属性),让SlaveClass对象将它的ChangeHappened作为事件处理程序添加.这将说明:
...Master...
public delegate void ChangeHappenedDelegate(object sender, NewsInfoArgs args);
public event NewUpdateDelegate ChangeHappenedEvent;
....
public SlaveClass (MasterClass publisher) //inject publisher service
{
publisher.ChangeHappenedEvent += ChangeHappened;
}
Run Code Online (Sandbox Code Playgroud)
但这似乎是Slave和Master之间不必要的耦合,但我喜欢所提供的内置事件通知机制的优雅.
那么我应该保留当前的代码,还是转向基于事件的方法(使用发布者注入)?为什么?
或者,如果您可以提出我可能错过的替代解决方案,我也会感激.
这里有新成员.很高兴看到这样一个整洁的社区.
经过一番研究,我决定在我的应用程序中使用WCF进行进程间通信,所以我使用的是NetNamedPipeBinding绑定.
ServiceHost托管应用程序不是专用服务器,因此必须通过线程生成ServiceHost.到现在为止还挺好.
所以我有以下内容:
Foo()
{
Thread serverThread = new Thread(new ThreadStart(ServerThread));
serverThread.Start();
Console.WriteLine("Foo Exited");
}
ServerThread()
{
Uri baseAddress = new Uri("net.pipe://localhost/service");
ServiceHost serviceHost = new ServiceHost(typeof(MyService), baseAddress);
...
serviceHost.Open();
Console.WriteLine("Server Thread Exited");
}
Run Code Online (Sandbox Code Playgroud)
正如所料,我看到:
-> Server Thread Exited
-> Foo Exited
Run Code Online (Sandbox Code Playgroud)
但令我惊讶的是,即使服务器运行的线程很兴奋,客户端仍然可以连接到serviceHost,服务主机可以正确处理请求!
那么,为什么ServiceHost仍在处理和处理请求,即使它的主线程(它创建的那个)已经死了?
还有一种更好的方法可以让ServerThread保持活动一段时间(真实){Thread.休眠状态(100);}?
谢谢.