2011-08-22 56 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調用與回調模型掛!