使用事件的回调方式
本文关键字:回调 方式 事件 | 更新日期: 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
打电话OnConnected
或OnDisconnected
.
所以,我有两个问题:1._someSystemObj
如何调用OnConnected方法(它使用观察者模式,或者它可以以其他方式使用它。你能描述一下吗?获取一些原理图代码以了解它是如何工作的。
- 如果我想在
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...
}
}