GetChangeBatch メソッド
派生クラスでオーバーライドされると、同期先プロバイダーからの指定されたナレッジに含まれていない項目に関する、項目メタデータが含まれた変更バッチを取得します。
名前空間: Microsoft.Synchronization
アセンブリ: Microsoft.Synchronization (Microsoft.Synchronization.dll 内)
構文
'宣言
Public MustOverride Function GetChangeBatch ( _
batchSize As UInteger, _
destinationKnowledge As SyncKnowledge, _
<OutAttribute> ByRef changeDataRetriever As Object _
) As ChangeBatch
'使用
Dim instance As KnowledgeSyncProvider
Dim batchSize As UInteger
Dim destinationKnowledge As SyncKnowledge
Dim changeDataRetriever As Object
Dim returnValue As ChangeBatch
returnValue = instance.GetChangeBatch(batchSize, _
destinationKnowledge, changeDataRetriever)
public abstract ChangeBatch GetChangeBatch(
uint batchSize,
SyncKnowledge destinationKnowledge,
out Object changeDataRetriever
)
public:
virtual ChangeBatch^ GetChangeBatch(
unsigned int batchSize,
SyncKnowledge^ destinationKnowledge,
[OutAttribute] Object^% changeDataRetriever
) abstract
abstract GetChangeBatch :
batchSize:uint32 *
destinationKnowledge:SyncKnowledge *
changeDataRetriever:Object byref -> ChangeBatch
public abstract function GetChangeBatch(
batchSize : uint,
destinationKnowledge : SyncKnowledge,
changeDataRetriever : Object
) : ChangeBatch
パラメーター
- batchSize
型 : System. . :: . .UInt32
変更バッチに含める変更の数です。
- destinationKnowledge
型 : Microsoft.Synchronization. . :: . .SyncKnowledge
同期先プロバイダーからのナレッジです。このナレッジは、変更の列挙で使用する前に、同期元ナレッジに対して MapRemoteKnowledgeToLocal を呼び出すことでマップしておく必要があります。
- changeDataRetriever
型 : System. . :: . .Object%
変更データを取得するために使用できるオブジェクトを返します。これには、IChangeDataRetriever オブジェクトまたはプロバイダー固有のオブジェクトを指定できます。
戻り値
型 : Microsoft.Synchronization. . :: . .ChangeBatch
同期先プロバイダーからの指定されたナレッジに含まれていない項目に関する、項目メタデータが含まれた変更バッチです。nullNothingnullptrunitNULL 参照 (Visual Basic では Nothing) は指定できません。
説明
同じ変更は複数のバッチに出現しません。
batchSize で指定された数より少ない数の変更が残った場合、より小さなバッチが返されます。
変更が残っていないときにこのメソッドが呼び出された場合は、InvalidOperationException がスローされます。
実装に関するメモ
このバッチの後で送信する変更がもうない場合は、返される変更バッチで IsLastBatch を true に設定する必要があります。そうしないと、次の変更バッチを取得するために、Sync Framework によって GetChangeBatch が再度呼び出されます。
例
次の例では、メタデータ ストアから変更バッチを取得します。
public override ChangeBatch GetChangeBatch(uint batchSize, SyncKnowledge destinationKnowledge, out object changeDataRetriever)
{
// Return this object as the IChangeDataRetriever object that is called to retrieve item data.
changeDataRetriever = this;
// Call the metadata store to get a batch of changes.
return _itemStore.ContactReplicaMetadata.GetChangeBatch(batchSize, destinationKnowledge);
}
次の例は、前の例で呼び出された GetChangeBatch メソッドを示しています。この例では、ChangeBatch オブジェクトを作成し、順序付られているグループを開始します。項目が同期先ナレッジに含まれていない場合は、順序付られているグループに項目を追加します。
public override ChangeBatch GetChangeBatch(uint batchSize, SyncKnowledge destinationKnowledge)
{
// The destination knowledge must be converted to be compatible with the source replica
// before it can be used.
SyncKnowledge mappedDestKnowledge = _knowledge.MapRemoteKnowledgeToLocal(destinationKnowledge);
// Create a new change batch, initialized by using the current knowledge of the source replica
// and a new ForgottenKnowledge object.
ChangeBatch changeBatch = new ChangeBatch(IdFormats, GetKnowledge(), new ForgottenKnowledge());
// Start a group of changes in the change batch. The group is ordered by item ID.
// _getChangeBatchCurrent is 0 the first time GetChangeBatch is called, and is used to track the
// position in the metadata store for subsequent calls to GetChangeBatch.
changeBatch.BeginOrderedGroup(_items.Values[_getChangeBatchCurrent].GlobalId);
// itemsAdded is incremented each time a change is added to the change batch. When itemsAdded
// is greater than the requested batch size, enumeration stops and the change batch is returned.
int itemsAdded = 0;
ItemMetadata itemMeta;
// Enumerate items and add a change to the change batch if it is not contained in the
// destination knowledge.
// _items is a SortedList that contains ItemMetadata objects that are ordered by item ID.
for (; itemsAdded <= batchSize && _getChangeBatchCurrent < _items.Count; _getChangeBatchCurrent++)
{
itemMeta = _items.Values[_getChangeBatchCurrent];
ChangeKind kind = (itemMeta.IsDeleted) ? ChangeKind.Deleted : ChangeKind.Update;
ItemChange change = new ItemChange(IdFormats, ReplicaId, itemMeta.GlobalId, kind, itemMeta.CreationVersion,
itemMeta.ChangeVersion);
// If the change is not contained in the destination knowledge, add it to the change batch.
if (!mappedDestKnowledge.Contains(change))
{
changeBatch.AddChange(change);
itemsAdded++;
}
}
// End the group of changes in the change batch. Pass the current source knowledge.
changeBatch.EndOrderedGroup(_items.Values[_getChangeBatchCurrent - 1].GlobalId, _knowledge);
// When all items in the metadata store have been enumerated, set this batch as the
// last batch.
if (_getChangeBatchCurrent == _items.Count)
{
changeBatch.SetLastBatch();
}
return changeBatch;
}