ISimpleSyncProviderConcurrencyConflictResolver インターフェイス
同じ項目がローカル レプリカで更新されると同時にリモート レプリカで削除された場合など、同時実行の競合を処理するカスタム競合回避モジュールを表します。
名前空間: Microsoft.Synchronization.SimpleProviders
アセンブリ: Microsoft.Synchronization.SimpleProviders (Microsoft.Synchronization.SimpleProviders.dll 内)
構文
'宣言
Public Interface ISimpleSyncProviderConcurrencyConflictResolver
'使用
Dim instance As ISimpleSyncProviderConcurrencyConflictResolver
public interface ISimpleSyncProviderConcurrencyConflictResolver
public interface class ISimpleSyncProviderConcurrencyConflictResolver
type ISimpleSyncProviderConcurrencyConflictResolver = interface end
public interface ISimpleSyncProviderConcurrencyConflictResolver
説明
同時実行の競合の詳細については、「簡易プロバイダーの競合処理」を参照してください。
例
この例では、同時実行の競合および制約の競合に対する競合処理ポリシーに、既定の ApplicationDefined をそのまま使用しています。つまり、アプリケーションで、ItemConflicting イベントと ItemConstraint イベントに登録し、同期処理中に発生した競合の解決アクションを指定する必要があります。詳細については、「簡易プロバイダーの競合処理」を参照してください。完全なアプリケーションのコンテキストでこのコードを表示するには、Sync Framework SDK や Code Gallery から入手できる "Sync101 using Simple Sync Provider" アプリケーションを参照してください。 次のコード例は、MyFullEnumerationSimpleSyncProvider のコンストラクターで指定されるイベント ハンドラーです。
this.ItemConstraint += new EventHandler<SimpleSyncItemConstraintEventArgs>(OnItemConstraint);
this.ItemConflicting += new EventHandler<SimpleSyncItemConflictingEventArgs>(OnItemConflicting);
AddHandler Me.ItemConstraint, AddressOf HandleItemConstraint
次のコード例は、イベント ハンドラーで競合の解決アクションを Merge に設定しています。
void OnItemConstraint(object sender, SimpleSyncItemConstraintEventArgs e)
{
// Set the resolution action for constraint conflicts.
// In this sample, the provider checks for duplicates in InsertItem, and this event would
// fire if a duplicate occurred.
e.SetResolutionAction(ConstraintConflictResolutionAction.Merge);
}
void OnItemConflicting(object sender, SimpleSyncItemConflictingEventArgs e)
{
// Set the resolution action for concurrency conflicts.
e.SetResolutionAction(ConflictResolutionAction.Merge);
}
Private Sub HandleItemConstraint(ByVal sender As Object, ByVal e As SimpleSyncItemConstraintEventArgs)
' Set the resolution action for constraint conflicts.
' In this sample, the provider checks for duplicates in InsertItem, and this event would
' fire if a duplicate occurred.
e.SetResolutionAction(ConstraintConflictResolutionAction.Merge)
End Sub
Private Sub HandleItemConflicting(ByVal sender As Object, ByVal e As SimpleSyncItemConflictingEventArgs)
' Set the resolution action for concurrency conflicts.
e.SetResolutionAction(ConflictResolutionAction.Merge)
End Sub
次のコード例は、同時実行の競合に対する解決アクションとして Merge を選択した場合に実装する ResolveUpdateUpdateConflict メソッドを示しています。
public void ResolveUpdateUpdateConflict(object itemData,
IEnumerable<SyncId> changeUnitsToMerge,
IEnumerable<SyncId> changeUnitsToUpdate,
ItemFieldDictionary keyAndExpectedVersion,
RecoverableErrorReportingContext recoverableErrorReportingContext,
out ItemFieldDictionary updatedVersion)
{
ItemTransfer transfer = (ItemTransfer)itemData;
ItemData dataCopy = new ItemData(transfer.ItemData);
// Combine the conflicting data.
ItemData mergedData = (_store.Get(transfer.Id)).Merge((ItemData)dataCopy);
ulong timeStamp = _store.UpdateItem(transfer.Id, mergedData);
updatedVersion = new ItemFieldDictionary();
updatedVersion.Add(new ItemField(CUSTOM_FIELD_TIMESTAMP, typeof(ulong), timeStamp));
}
Public Sub ResolveUpdateUpdateConflict(ByVal itemData As Object, ByVal changeUnitsToMerge As IEnumerable(Of SyncId), ByVal changeUnitsToUpdate As IEnumerable(Of SyncId), ByVal keyAndExpectedVersion As ItemFieldDictionary, ByVal recoverableErrorReportingContext As RecoverableErrorReportingContext, _
ByRef updatedVersion As ItemFieldDictionary) Implements ISimpleSyncProviderConcurrencyConflictResolver.ResolveUpdateUpdateConflict
Dim transfer As ItemTransfer = DirectCast(itemData, ItemTransfer)
Dim dataCopy As New ItemData(transfer.ItemData)
' Combine the conflicting data.
Dim mergedData As ItemData = (_store.[Get](transfer.Id)).Merge(DirectCast(dataCopy, ItemData))
Dim timeStamp As ULong = _store.UpdateItem(transfer.Id, mergedData)
updatedVersion = New ItemFieldDictionary()
updatedVersion.Add(New ItemField(CUSTOM_FIELD_TIMESTAMP, GetType(ULong), timeStamp))
End Sub