在接口里定义事件,注册事件是不是要实例这个接口

那该多好啊!!! 2024-07-11 17:29:10

 

 

 

比如我写一个DLL,我的DLL需要把数据传给上位机,于是我定义一个接口
但是我又需要上位机把一些数据传给我,于是我在接口里又定义一个事件。
现在的问题是,我的DLL里如果要获得接口里的事件,我是不是要实例化接口,然后在注册这个事件。。。
如果是这样,那我定义的这个接口岂不被二边实例化,首先是上位机要调用我DLL里的接口所以要实例化我的接口的。然后我要获得上位机引发的事件,那我也要实例化我自己定义的接口吗

...全文
314 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
huaqianzkh 2024-10-17
  • 打赏
  • 举报
回复

是不是可以考虑消息机制。

tcmakebest 2024-07-13
  • 打赏
  • 举报
回复

事件只能在同一个电脑上使用, 关键是如何获取得上位机数据
如果可以在DLL上传数据之后立即得到上位机的数据,可以通过返回值得到.
如果DLL不上传数据,上位机也有数据要发,那就比较复杂了,
一是可以做成互为上位机和下位机
二是下拉机不断查询上位机是否有数据要发,通过返回值得到(注意查询频率)
三是建立长连接(最大难度不建议)

勇敢滴勇 2024-07-12
  • 打赏
  • 举报
回复

在C#中,当你在接口中定义事件时,通常不需要实例化接口本身,而是通过接口的实现类来实现和触发事件。你只需要确保上位机(客户端)通过接口的实现类来注册和处理事件。

定义接口与事件

假设你有一个接口 IMyInterface,在其中定义了一个事件:

public interface IMyInterface
{
    event EventHandler<MyEventArgs> MyEvent;
    void SendData(string data);
}

实现接口

你的DLL中需要实现这个接口。实现类需要提供事件的触发机制和接口方法的实现:

public class MyImplementation : IMyInterface
{
    public event EventHandler<MyEventArgs> MyEvent;

    public void SendData(string data)
    {
        // 处理接收到的数据
        // 假设在处理数据后需要触发事件
        OnMyEvent(new MyEventArgs(data));
    }

    protected virtual void OnMyEvent(MyEventArgs e)
    {
        MyEvent?.Invoke(this, e);
    }
}

使用接口与事件

上位机(客户端)将使用你的接口实现类来注册事件处理程序并发送数据。你不需要在DLL中实例化接口,只需要实例化实现类:

class Program
{
    static void Main()
    {
        IMyInterface myInterface = new MyImplementation();
        
        // 注册事件处理程序
        myInterface.MyEvent += MyInterface_MyEvent;
        
        // 调用方法,模拟发送数据
        myInterface.SendData("Hello from upper machine!");
    }

    private static void MyInterface_MyEvent(object sender, MyEventArgs e)
    {
        Console.WriteLine("Event received: " + e.Data);
    }
}

总结

  1. 接口定义:在接口中定义事件。
  2. 实现接口:在DLL中实现接口,包括事件的触发机制。
  3. 实例化实现类:上位机通过实例化实现类来使用接口,注册事件并调用接口方法。
  4. 事件处理:上位机注册事件处理程序来处理事件。

通过这种方式,你不会在DLL中重复实例化接口,而是通过实现类来处理接口的功能和事件。上位机只需实例化实现类并注册事件处理程序。

小王毕业啦 2024-07-11
  • 打赏
  • 举报
回复

此内容由Chat GPT 3.5提供:在接口中定义事件是一种常见的做法,但在C#中,接口是不能被实例化的,因为接口只定义了一组成员的契约,具体的实现需要在类中完成。所以在你的情况下,不需要实例化接口来注册事件。你可以在类中实现接口,并在类的构造函数中注册事件。当你需要处理上位机传过来的数据时,直接在事件处理方法中执行相应的逻辑。在你的DLL中,可以定义一个类实现接口并注册事件,然后将这个类的实例作为DLL的公共接口供上位机调用。这样既避免了接口被多次实例化的问题,也能实现你的需求。

  • 举报
回复
@小王毕业啦 dll是别人写的,接口也是dll里写的,我写的是上位机,我需要通过接口里的事件把数据传给dll 也需要接收dll里传过来的数据 我写了一个类继承接口,在接口他定义了一个事件 我触发事件,把数据传给他 现在的问题是,他是不是也要写个类实现接口,因为他要注册事件才能收到我传来的数据
  • 举报
回复
@小王毕业啦 那dll自己写的接口,也需要自己在写个类实现接口,注册事件,获得我上位机通过事件传给他的数据吗? 如果这样,等于dll写的接口被二边都分别写个类实现了接口
wanghui0380 2024-07-11
  • 打赏
  • 举报
回复

至于你说啥上位机调用你如何?
我不知道你到底跟上位机是啥关系?

2个进程?一个进程?
1台机器?2台机器?

说白了就是,他跟他是不是同一台机器的同一个进程。先把这个弄清楚了,我们在回答

wanghui0380 2024-07-11
  • 打赏
  • 举报
回复

你先说你跟上位机用什么交互把。
用dll交互的?那就实例化一次。全局单例即可。

只能说到这里了。net目前被园子调教的太散了,都不在一个频道了。
你全局静态对象OK,双lock单例也行(这是园子派所谓的充血,贫血,所谓线程安全单例)
你直接用C# lazy 也可以,非园子派直接用这个把,又不是java卷王刷术语,一个lazy即单例又贫血还线程线程安全,搞那么多花头做甚

Lazy<T> 

netcore(net4.62以上)lazy都可以省掉,直接Service.addsingleton<你的那个类> 就行,至于你说的接口事件么,你构造注入了,想在那个类订阅就在哪个类订阅

111,044

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧