C# 远程事件

C# 远程事件,c#,.net-remoting,C#,.net Remoting,我正在尝试做一个服务器客户端应用程序,以了解更多关于使用c#的远程程序的信息 结构很简单 我有一个服务器,它在调用函数updateInventory时触发一个事件,并且每个客户端(使用委托)向该事件注册一个函数 因此,当任何客户机更新库存(通过调用updateInventory函数)时,所有客户机都会通过事件的方式得到警告 现在的问题是它根本不起作用,当客户端调用updateInventory函数时,服务器中的函数不会被调用 该计划包括以下4个组成部分: 库存变更标准 它是可序列化的,并用作事件

我正在尝试做一个服务器客户端应用程序,以了解更多关于使用c#的远程程序的信息

结构很简单

我有一个服务器,它在调用函数updateInventory时触发一个事件,并且每个客户端(使用委托)向该事件注册一个函数

因此,当任何客户机更新库存(通过调用updateInventory函数)时,所有客户机都会通过事件的方式得到警告

现在的问题是它根本不起作用,当客户端调用updateInventory函数时,服务器中的函数不会被调用

该计划包括以下4个组成部分:

库存变更标准

它是可序列化的,并用作事件触发的函数的参数。我将其编译为.dll,并通过“添加引用…”在服务器和客户端上使用:

库存管理器

它声明委托、事件和何时触发事件。客户端有相同的类,唯一的区别是UpdateInventory内容,它是空的……其他的都是一样的

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();
    }
}