C# 远程事件
我正在尝试做一个服务器客户端应用程序,以了解更多关于使用c#的远程程序的信息 结构很简单 我有一个服务器,它在调用函数updateInventory时触发一个事件,并且每个客户端(使用委托)向该事件注册一个函数 因此,当任何客户机更新库存(通过调用updateInventory函数)时,所有客户机都会通过事件的方式得到警告 现在的问题是它根本不起作用,当客户端调用updateInventory函数时,服务器中的函数不会被调用 该计划包括以下4个组成部分: 库存变更标准 它是可序列化的,并用作事件触发的函数的参数。我将其编译为.dll,并通过“添加引用…”在服务器和客户端上使用: 库存管理器 它声明委托、事件和何时触发事件。客户端有相同的类,唯一的区别是UpdateInventory内容,它是空的……其他的都是一样的C# 远程事件,c#,.net-remoting,C#,.net Remoting,我正在尝试做一个服务器客户端应用程序,以了解更多关于使用c#的远程程序的信息 结构很简单 我有一个服务器,它在调用函数updateInventory时触发一个事件,并且每个客户端(使用委托)向该事件注册一个函数 因此,当任何客户机更新库存(通过调用updateInventory函数)时,所有客户机都会通过事件的方式得到警告 现在的问题是它根本不起作用,当客户端调用updateInventory函数时,服务器中的函数不会被调用 该计划包括以下4个组成部分: 库存变更标准 它是可序列化的,并用作事件
public class InventoryManager:MarshalByRefObject
{
public delegate string InventoryChangeHandler(object sender, InventoryChangeArgs info);
public event InventoryChangeHandler Changed;
public void UpdateInventory(string pno, int change)
{
Console.WriteLine("UpdateInveroty has been invoced");
if (change == 0)
Console.WriteLine("No changed event");
else if (Changed != null)
{
Changed(this, new InventoryChangeArgs(pno, change));
Console.WriteLine("Changed event");
}
}
}
事件在客户端的功能
向事件中添加Wan功能并设置远程处理配置:
class Client
{
static void Warn(object sender,InventoryChangeArgs args)
{
Console.WriteLine("It was changed by: {0] the {1}",args.Change,args.Pno);
}
static void Main(string[] args)
{
RemotingConfiguration.Configure("Client.exe.config",false);
InventoryManager inv=new InventoryManager();
inv.Changed+=new InventoryManager.InventoryChangeHandler(Warn);
Console.WriteLine("Client started");
inv.UpdateInventory("102", 2);
Console.ReadLine();
}
}
远程配置文件
这是客户端、服务器的远程配置文件,除了以下几行之外几乎相同:
...
<application name="Server">
<service>
<wellknown
mode="Singleton"
type="InventoryManager, InventoryManager"
objectUri="InventoryManager" />
</service>
...
<channel ref="tcp" port="9000">
。。。
...
如果有人能给我一些帮助,我将不胜感激。
提前谢谢我想你的问题是,你没有看到事件被提出?我的意思是:eventhandler(您案例中的Warn方法)没有被执行 原因是,您无法在一个AppDomain上调用事件,并且假设您可以在另一个AppDomain中处理该事件。 为了能够做到这一点,您还需要某种类型的“代理”对象,它也是
MarshalByRef
该类可以如下所示,例如:
public abstract class InventoryManagerUpdatedDelegateObject : MarshalByRefObject
{
public void InventoryManagerUpdatedCallback( object sender, InventoryChangeArgs e )
{
InventoryManagerUpdatedCallbackCore (sender, e);
}
protected abstract InventoryManagerUpdatedCallbackCore( object sender, InventoryChangeArgs e );
public override object InitializeLifetimeService()
{
return null;
}
}
这个类在服务器端和客户端都应该是已知的。因此,最好将其放在定义InventoryChangeArgs
类的同一DLL中
在客户端,您可以创建上述类的实现:
public class ConsoleReporter : InventoryManagerUpdatedDelegateObject
{
protected override InventoryManagerUpdatedCallbackCore( object sender, InventoryChangeArgs e )
{
Console.WriteLine("It was changed by: {0] the {1}",args.Change,args.Pno);
}
}
在客户端,执行以下操作:
class Client
{
static void Warn(object sender,InventoryChangeArgs args)
{
Console.WriteLine("It was changed by: {0] the {1}",args.Change,args.Pno);
}
static void Main(string[] args)
{
RemotingConfiguration.Configure("Client.exe.config",false);
InventoryManager inv=new InventoryManager();
ConsoleReporter reporter = new ConsoleReporter();
inv.Changed += reporter.InventoryManagerUpdatedCallback;
Console.WriteLine("Client started");
inv.UpdateInventory("102", 2);
Console.ReadLine();
}
}
在开始使用.NET远程处理之前,您应该阅读清楚地说明它是一种已被放弃的技术:“不建议用于新的开发。”。的准确副本
public class ConsoleReporter : InventoryManagerUpdatedDelegateObject
{
protected override InventoryManagerUpdatedCallbackCore( object sender, InventoryChangeArgs e )
{
Console.WriteLine("It was changed by: {0] the {1}",args.Change,args.Pno);
}
}
class Client
{
static void Warn(object sender,InventoryChangeArgs args)
{
Console.WriteLine("It was changed by: {0] the {1}",args.Change,args.Pno);
}
static void Main(string[] args)
{
RemotingConfiguration.Configure("Client.exe.config",false);
InventoryManager inv=new InventoryManager();
ConsoleReporter reporter = new ConsoleReporter();
inv.Changed += reporter.InventoryManagerUpdatedCallback;
Console.WriteLine("Client started");
inv.UpdateInventory("102", 2);
Console.ReadLine();
}
}