【问题标题】:C# : raise event in class bases on event in other classC#:基于其他类中的事件引发类中的事件
【发布时间】:2020-03-22 09:16:19
【问题描述】:

在我的应用程序中,我有一个接口 IEncoder,它具有事件 EncoderCaller。

public interface IEncoder
{
    event EncoderCaller EncoderCalled;
}

public  delegate void EncoderCaller(object Source, EventArgs args);

public class Video
{
    public string Title { get; set; }
}

public class VideoEventArgs : EventArgs
{
    public Video xVideo { get; set; }
}


public class DetectionAction : IEncoder
{
    public event EncoderCaller EncoderCalled;

    public void Encode(Video video)
    {
        //some logic to encode video

        OnVideoEncoded();
    }

    protected virtual void OnVideoEncoded()
    {
        if (EncoderCalled != null)
            EncoderCalled(this, EventArgs.Empty);

    }
}

public class Client1: IEncoder
{

}

我需要某种机制来共享合约,如果任何客户端都实现了该机制,那么该事件将触发我的类 DetectionAction 中的事件。

谁能告诉我,我在做正确的事吗?

如何实现?

【问题讨论】:

  • 我不明白你的问题。您能否通过更多示例阐明需要做什么?
  • 假设我有两个应用程序,应用程序 A 和应用程序 B。我想共享一个具有事件通知类型的合同,如果应用程序 B 实现该事件并且在该事件上应用程序 A 事件应该也得到提升。这是我正在努力实现的目标

标签: c# events delegates


【解决方案1】:

如果你在同一个进程中有两个类,你可以考虑像这样显式地链接事件:

public class Client1 : IEncoder
{
    public event EncoderCaller EncoderCalled;

    public Client1(IEncoder anotherEncoder)
    {
        // Listen to event raised on another instance and raise event on this instance.
        anotherEncoder.EncoderCalled += OnAnotherEncoderCalled;
    }

    private void OnAnotherEncoderCalled(object source, EventArgs args)
    {
        if (EncoderCalled != null)
            EncoderCalled(this, EventArgs.Empty);
    }
}

在这种情况下,例如,anotherEncoderDetectionAction

但是,如果您正在寻找在不同进程中运行的两个不同应用程序之间共享事件的解决方案,您可能会考虑进程间通信,例如这篇文章:

Listen for events in another application

上面的示例代码仍然有效,但在这种情况下,IEncoder 是一个支持 IPC 的实现,例如一个消息队列侦听器,它在收到消息时引发事件。

【讨论】:

    猜你喜欢
    • 2010-10-21
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 2015-10-05
    相关资源
    最近更新 更多