拉Vs推模型

EvtSubscribe Pull Vs Push Model

本文关键字:模型 Vs      更新时间:2023-10-16

我正在尝试从windows使用以下api。

EVT_HANDLE WINAPI EvtSubscribe(
  __in  EVT_HANDLE Session,
  __in  HANDLE SignalEvent,
  __in  LPCWSTR ChannelPath,
  __in  LPCWSTR Query,
  __in  EVT_HANDLE Bookmark,
  __in  PVOID context,
  __in  EVT_SUBSCRIBE_CALLBACK Callback,
  __in  DWORD Flags
);

此api支持两种订阅模式PULLPUSH

有两种订阅模式:拉动模式和推送模式。在推送模型中,您实现订阅回调,并将callback参数设置为您的实现。该服务将调用您的回调,每个事件匹配您的查询条件(或如果发生错误)。

在pull模型中,您创建一个服务发出信号的事件对象。发出信号后,使用订阅句柄调用EvtNext函数来枚举事件。必须对枚举的每个事件调用EvtClose函数。然后重置对象并等待服务再次发出信号。此过程会一直重复,直到您取消订阅为止。

我想知道哪个模型是可伸缩的。以及选择一种型号的优缺点。

回调函数是从另一个线程调用的,所以你可能必须同步,如果你必须同步,它将更容易与拉模型…如果同步,它将更容易关闭订阅与事件,因为你可以等待两个事件,一个来自EvtSubscribe和一个关闭…我浪费了几个小时来理解为什么我对EvtClose的调用与回调模型挂起!

同意Jean Davy的观点

Pull方法将帮助你更容易地处理多线程,因为基本上主线程将能够处理所有事情。其简单。