2011-08-22 124 views
0

我尝试使用下面从Windows API。EvtSubscribe拉Vs的推模式

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 
); 

This api supports two models for subscriptionPULLPUSH

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

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

我想知道哪种模式会伸缩。选择一个模型而不是另一个模型的优点/缺点是什么?

回答

0

回调函数从另一个线程调用,所以你可能必须同步,如果你有同步的它会随着拉模型更容易...如果同步会更容易与事件关闭订阅,因为你可能会等待两个事件中,一名来自EvtSubscribe和一个收... 我浪费了一些时间理解为什么我要EvtClose调用与回调模型挂!