使用事件的回调方式

本文关键字:回调 方式 事件 | 更新日期: 2023-09-27 18:35:02

我不明白回调的一些工作。

我有一些第三方代码连接,断开连接,订阅来自某个系统的值。

因此,示例是:

class Subscriber:ISubscriber
{
  public void OnConnected()
  {
  }
 public void OnDisconnected()
  {
  }
}

然后,它使用:

var subscriber=new Subscriber();
_someSystemObj.CreateConnection(subscriber); //i do not understand how it works there

然后_someSystemObj打电话OnConnectedOnDisconnected.

所以,我有两个问题:1._someSystemObj如何调用OnConnected方法(它使用观察者模式,或者它可以以其他方式使用它。你能描述一下吗?获取一些原理图代码以了解它是如何工作的。

  1. 如果我想在OnDisconnect发生时执行许多步骤:我应该将一些公共事件扔给其他类吗?我的意思是我不能在这个OnDisconnect方法中断开连接(我必须在代码的其他部分执行一些步骤,在这个 API 的旧版本中,我只是在我的程序之上重新抛出事件OnDisconnect然后处理它。

这个旧版本的代码看起来像:

_server.OnDisconnect+=OnDisconnectHandler;
void OnDisconnectHandler(..)
{
 if(OnReconnect!=null)//some public event
   OnReconnect(e);// throw on top of my program and then handle it there
}

在新版本的 API 中,我尝试通过添加公共事件来解决它,当 OnDisconnect 发生时将其扔在顶部:

class Subscriber:ISubscriber
{
  public event EventHandler<EventArgs> OnDisconnectedHappens;
  public void OnConnected()
   {
   }
public void OnDisconnected()
  {
        if(OnDisconnectedHappens!=null)
           OnDisconnectedHappens(this,e);//thow on top
  }
}

在某些地方:

   _subscriber.OnDisconnectHappens+=OnDisconnectHandler; //and do my work

或者,可能不是正确的方式。也许我应该做点别的?

请,你能给我一个链接,我可以了解这个事件回调模型吗?或者,也许我做对了?

使用事件的回调方式

_someSystemObj如何调用 OnConnected 方法?

好吧,当你打电话给它时,你给了它一个订阅者CreateConnection(subscriber). 它可能实现了这样的东西:

private readonly List<ISubscriber> _subscribers = new List<ISubscriber>();
public void CreateConnection(ISubscriber subscriber)
{
    _subscribers.Add(subscriber);
}
private void OnConnectedNotifySubscribers()
{
    foreach (ISubscriber subscriber in _subscribers)
    {
        subscriber.OnConnected();
    }
}

如果我想在发生 OnDisconnect 时执行许多步骤,我是否应该向其他类引发一些公共事件?

这是一个有效的选项,但是当事件链中的层太多时,调试可能会变得困难。 另一种选择是增加 Subscriber 类的功能,以便它可以执行处理订阅事件所需的一切。

class EmpoweredSubscriber : ISubscriber
{
    private readonly DisconnectWorker _worker;
    private readonly DisconnectHelper _helper;
    public EmpoweredSubscriber(DisconnectWorker worker, DisconnectHelper helper)
    {
        _worker = worker;
        _helper = helper;
    }
    public void OnConnected()
    {
    }
    public void OnDisconnected()
    {
        _worker.DoWork();
        _helper.DoHelp();
        // more...
    }
}