报告同步进度

Microsoft Sync Framework 通过使用 ProgressChanged 事件(对于托管代码)或 ISyncCallback::OnProgress 事件(对于非托管代码)向应用程序报告同步进度。引发此事件的时间和此事件所传送的信息取决于源提供程序的实现。

报告每个变更

默认情况下,对于目标提供程序应用的每个变更,Sync Framework 都将发送一次 ProgressChanged 事件(对于托管代码)或 ISyncCallback::OnProgress 事件(对于非托管代码)。Sync Framework 还将在完全应用每个变更批之后发送一次此事件。

仅当源提供程序未为变更和变更批指定工作量估计值时,才使用此默认进度通知。

报告估计的工作量

Sync Framework 还可以针对已应用的变更和变更批报告工作量估计值。源提供程序必须同时估计应用每个变更所需的工作量和完全应用每个变更批所需的工作量。源提供程序还必须估计同步会话中的剩余工作量。如果源提供程序已指定了这些值,则当正在应用一批变更时,随着目标提供程序应用每个变更、冲突或变更批,Sync Framework 将合计已完成的工作量。然后,Sync Framework 定期发送 ProgressChanged 事件(对于托管代码)或 ISyncCallback::OnProgress 事件(对于非托管代码),以报告已完成的当前工作量总计和会话中的总工作量。Sync Framework 还将在完全应用每个变更批之后发送此事件。

若要报告估计的工作量进度,源提供程序必须按照下表中所述,为每个变更和每个变更批指定估计工作量,并为会话指定剩余工作量。

估计的工作量类型 使用托管代码指定 使用非托管代码指定

变更

WorkEstimate

ISyncChangeBatchBase::AddItemMetadataToGroupISyncChangeBatch::AddLoggedConflict 的 dwWorkForChange 参数Sync Framework 还通过 ISyncChange::SetWorkEstimate 提供此值。

变更批

BatchWorkEstimate

ISyncChangeBatchBase::SetWorkEstimateForBatch

会话

RemainingSessionWorkEstimate

ISyncChangeBatchBase::SetRemainingWorkEstimateForSession

报告自定义进度

提供程序也可以随时通过调用 OnProgressChanged(对于托管代码)或 ISyncSessionState::OnProgress(对于非托管代码)发送进度通知。如果将同步阶段指定为 ChangeApplication(对于托管代码)或 SPS_CHANGE_APPLICATION(对于非托管代码),则 Sync Framework 在每次发送进度通知时都将累计已完成的总工作量。Sync Framework 还将指定的总工作量解释为会话的剩余工作量,并通过将指定的总工作量添加到已完成工作量的累计值来计算会话的总工作量。然后,Sync Framework 将这些计算值传递给进度通知事件。当同步阶段为任何其他有效值时,工作量估计值将直接传递到进度通知事件。

必须非常小心,以避免当源提供程序指定工作量估计值时,以及当目标提供程序发送进度通知并为同步状态指定 ChangeApplication(对于托管代码)或 SPS_CHANGE_APPLICATION(对于非托管代码)时,两次报告同一个工作量。这是因为 Sync Framework 会在变更应用过程中每次发送进度通知时合计已完成的工作量值。如果提供程序发送其自己的进度通知,Sync Framework 会将提供程序指定的估计工作量值添加至会话的已完成总工作量中。这会导致两次计入同一工作量:由 Sync Framework 报告时计入一次,由提供程序报告时计入一次。

请参阅

概念

实现标准自定义提供程序
响应同步事件