Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Thema wird die Einführung von Indizierungspriorisierungs- und Rowset-Ereignissen für Windows 7 beschrieben.
Dieses Thema ist wie folgt organisiert:
Indizieren von Priorisierungs- und Rowsetereignissen
In Windows 7 und höher gibt es einen Prioritätsstapel, bei dem der Kontext einer bestimmten Abfrage es dem Client ermöglicht zu verlangen, dass die in dieser Abfrage verwendeten Bereiche über den normalen Elementen priorisiert werden.
Dieser Priorisierungsstapel weist die folgenden Merkmale auf:
- Elemente im Stapel können Vordergrund,Hohe oder niedrige Priorität aufweisen:
- Foreground: Backoff-Logik wird übersprungen und die Indizierung wird so schnell fortgesetzt, wie der Computer zulässt.
- Hoch: Priorisierung wurde mit Backoff angefordert.
- Niedrig: Eine Priorisierung wurde angefordert, nicht auf Kosten anderer Bereiche auf dem Stack, sondern vor den nicht priorisierten Indizierungen.
- Jede Anforderung für hohe oder Vordergrundpriorität stoßt die anfordernde Abfrage automatisch an den Anfang des Stapels.
- Nur das Element oben im Stapel kann Vordergrundpriorität haben.
- Eine Abfrage mit Vordergrundpriorität, die in der Priorität herabgestuft wird, erhält ein Ereignis, das darüber informiert, dass sie die Vordergrundpriorität verloren hat und nun eine hohe Priorität mit Verzögerung besitzt.
Der Prioritätsstapel legt eine allgemeine Priorität von Elementen fest, die im Indexer wie folgt verarbeitet werden:
Benachrichtigungen mit hoher Priorität verfügen nicht über einen Backoff und werden in der Regel nur für eine kleine Anzahl von Elementen gesendet. Beispielsweise verwendet Windows Explorer diese Priorität für kleine Kopierengine-Operationen.
Der Prioritätsstapel befindet sich oben im Stapel, hat einen Backoff und ist die letzte angeforderte Prioritätsabfrage.
Zweite Abfrage im Stack.
Dritte Abfrage im Stapel.
Vierte Abfrage im Stack und so weiter.
Normale Prioritätselemente.
Gelöschte Elemente.
Hinweis
Elemente innerhalb jeder Gruppe werden intern über die ältere Semantik pro Element priorisiert.
IRowsetPriorisierung-Beispiele
Die primäre API zur Priorisierung ist über die folgende Schnittstelle verfügbar, die durch Abfragen des zurückgegebenen Rowsets aufgerufen werden kann:
typedef [v1_enum] enum
{
PRIORITY_LEVEL_FOREGROUND = 0, // process items in the scope first as quickly as possible
PRIORITY_LEVEL_HIGH = 1, // process items in the scope first at the normal rate
PRIORITY_LEVEL_LOW = 2, // process items in this scope before those at the normal rate, but after any other prioritization requests
PRIORITY_LEVEL_DEFAULT = 3 // process items at the normal indexer rate
} PRIORITY_LEVEL;
[
object,
uuid(IRowsetPrioritization_GUID),
pointer_default(unique)
]
interface IRowsetPrioritization : IUnknown
{
// Sets or retrieves the current indexer prioritization level for the scope specified by
// this query.
HRESULT SetScopePriority( [in] PRIORITY_LEVEL priority, [in] DWORD scopeStatisticsEventFrequency );
HRESULT GetScopePriority( [out] PRIORITY_LEVEL * priority, [out] DWORD * scopeStatisticsEventFrequency );
// Gets information describing the scope specified by this query:
// indexedDocumentCount - The total number of documents currently indexed in the scope
// oustandingAddCount - The total number of documents yet to be indexed in the scope (those not yet included in indexedDocumentCount)
// oustandingModifyCount - The total number of documents indexed in the scope that need to be re-indexed (included in indexedDocumentCount)
HRESULT GetScopeStatistics( [out] DWORD * indexedDocumentCount, [out] DWORD * oustandingAddCount, [out] DWORD * oustandingModifyCount );
};
Die Rowsetpriorisierung funktioniert wie folgt:
- IRowsetPrioritization wird mit der IUnknown::QueryInterface-Methode für ein Indexer-Rowset erworben. DBPROP_ENABLEROWSETEVENTS muss mit der OLE DB ICommandProperties::SetProperties-Methode auf TRUE festgelegt werden, bevor die Abfrage ausgeführt wird, um die Rowsetpriorisierung zu verwenden.
- IRowsetPrioritization::SetScopePriority legt die Priorisierung für die Bereiche fest, die zur Abfrage gehören, und das Intervall, in dem das Bereichsstatistikereignis ausgelöst wird, wenn es ausstehende Dokumente gibt, die in den Abfragebereichen indiziert werden sollen. Dieses Ereignis wird ausgelöst, wenn die Prioritätsstufe auf "Standard" festgelegt ist.
- IRowsetPrioritization::GetScopeStatistics kann verwendet werden, um die Anzahl der indizierten Elemente im Bereich abzurufen, die Anzahl der offenen Dokumente, die im Bereich hinzugefügt werden sollen, und die Anzahl der Dokumente, die in diesem Bereich neu indiziert werden müssen.
IRowsetPrioritization-Ereignisse
Es gibt drei Rowset-Ereignisse in IRowsetEvents::OnRowsetEvent in dem ROWSETEVENT_TYPE-Enumeration:
// This method allows for future notifications of various actions about your rowset or items within
// eventType: - An identifier of the particular event being sent
// pVarEventData: - The expected value of the EventData for each event type
// ROWSETEVENT_TYPE_DATAEXPIRED - VT_EMPTY
// ROWSETEVENT_TYPE_FOREGROUNDLOST - VT_EMPTY
// ROWSETEVENT_TYPE_SCOPESTATISTICS - VT_VECTOR | VT_UI4 - 3 elements (0 = indexed items, 1 = outstanding adds, 2 = oustanding modifies)
HRESULT OnRowsetEvent( [in] ROWSETEVENT_TYPE eventType, [in] REFPROPVARIANT eventData );
Die Rowset-Ereignisse sind wie folgt:
- Das ROWSETEVENT_TYPE_DATAEXPIRED-Ereignis gibt an, dass Daten, die das Rowset sichern, abgelaufen sind und dass ein neues Rowset angefordert werden soll.
- Das ROWSET_TYPE_FOREGROUNDLOST-Ereignis gibt an, dass ein Element, das zuvor im Priorisierungsstapel die Vordergrundpriorität hatte, herabgestuft wurde, weil eine andere Person ihre Priorität vor dieser Abfrage gesetzt hat.
- Das ROWSETEVENT_TYPE_SCOPESTATISTICS-Ereignis gibt Ihnen die gleichen Informationen aus dem IRowsetPrioritization::GetScopeStatistics-Methodenaufruf , aber über eine Pushmechanik wie folgt:
- Das Ereignis tritt auf, wenn die Priorisierungs-API verwendet wurde, um eine nicht standardmäßige Priorisierungsstufe und eine Nicht-Null-Statistikereignishäufigkeit anzufordern.
- Das Ereignis tritt nur auf, wenn sich Statistiken tatsächlich ändern und das in der IRowsetPrioritization angegebene Intervall abgelaufen ist (das Intervall garantiert nicht die Häufigkeit des Ereignisses).
- Dieses Ereignis wird garantiert einen "Bounce-Zustand null" auslösen (Null Elemente, die noch hinzugefügt werden sollen; Null verbleibende Modifikationen), vorausgesetzt, ein Nicht-Null-Ereignis wurde ausgelöst.
- Der Indexer kann Elemente verarbeiten, ohne dieses Ereignis zu senden, wenn die Warteschlange geleert wird, bevor die Häufigkeit des Statistikereignisses erreicht ist.
Weitere Ressourcen
Sehen Sie sich die folgenden Ressourcen im Zusammenhang mit Priorisierung und Rowsets an:
- Schnittstellen:
- Aufzählungen:
Zugehörige Themen