现在,我正处于原型设计阶段。所以我才刚刚开始。
情况:服务器 - 将运行测试并将进度发布到客户端,必须是低影响的,没有网络服务器,可能运行 xp Embedded 或 xp home。
客户 - 启动测试并接收进度报告。运行xp pro。
两台机器通过以太网连接。我想使用 .NET 远程处理在两台机器之间进行通信,并且我想使用事件来使用来自服务器的新结果更新客户端,但我已经读到在这些条件下事件是不可靠的。我该怎么做?服务器可以连接到客户端并使用远程处理来发布事件吗?这行得通吗?
现在,我正处于原型设计阶段。所以我才刚刚开始。
情况:服务器 - 将运行测试并将进度发布到客户端,必须是低影响的,没有网络服务器,可能运行 xp Embedded 或 xp home。
客户 - 启动测试并接收进度报告。运行xp pro。
两台机器通过以太网连接。我想使用 .NET 远程处理在两台机器之间进行通信,并且我想使用事件来使用来自服务器的新结果更新客户端,但我已经读到在这些条件下事件是不可靠的。我该怎么做?服务器可以连接到客户端并使用远程处理来发布事件吗?这行得通吗?
我曾经部署了一个使用远程处理的系统,服务器启动了一些客户端可以订阅的事件。
为了使它成为可能,您必须将 typeFilterLevel 设置为 full,并且您还必须创建一个在客户端和服务器上已知的“中间”对象,以便能够处理您的事件。
例如:这是服务器端和客户端已知的类。
public abstract class MyDelegateObject : MarshalByRefObject
{
public void EventHandlerCallback( object sender, EventArgs e )
{
EventHandlerCallbackCore(sender, e);
}
protected abstract void EventHandlerCallbackCore(object sender, EventArgs e );
public override object InitializeLifetimeService() { return null; }
}
在客户端,您创建另一个从上述类继承的类,并实现在引发事件时必须执行的实际逻辑。
public class MyConcreteHandler : MyDelegateObject
{
protected override EventHandlerCallbackCore(object sender, EventArgs e)
{
// do some stuff
}
}
您只需将事件处理程序附加到远程对象的事件,如下所示:
MyConcreteHandler handler = new MyConcreteHandler();
myRemoteObject.MyEventOccured += new EventHandler(handler.EventHandlerCallback);
当然,如果您在 EventHandler 类中更新 Winform 控件,该类也应该实现 ISynchronizeInvoke。
由于您仍处于原型设计阶段,您可能需要考虑使用 Windows Communication Foundation (WCF) 而不是远程处理。WCF 具有对发布-订阅方案的内置支持,并且已经包含 .NET 远程处理和 Web 服务的所有功能(据我了解)。
通过服务器连接到客户端,您实际上是在反转模型并使服务器成为客户端,反之亦然。
您最好让客户端启动测试,并轮询服务器以获取状态更新。
您选择的远程处理并不是什么大问题(并且对我提供的意见没有影响),但您可能想要调查它的替代品 (WCF),而不是花时间在“已替代但仍受支持”的技术上。