/// <summary> /// Called when the sync is over /// </summary> public Task EndSessionAsync(SyncResult syncResult, string scopeName = SyncOptions.DefaultScopeName, CancellationToken cancellationToken = default, IProgress <ProgressArgs> progress = null) { // Create a new context var ctx = new SyncContext(Guid.NewGuid(), scopeName); return(InternalEndSessionAsync(ctx, syncResult, cancellationToken, progress)); }
/// <summary> /// Called when the sync is over /// </summary> public async Task <SyncContext> InternalEndSessionAsync(SyncContext context, SyncResult result, CancellationToken cancellationToken = default, IProgress <ProgressArgs> progress = null) { context.SyncStage = SyncStage.EndSession; var connection = this.Provider.CreateConnection(); // Progress & interceptor await this.InterceptAsync(new SessionEndArgs(context, result, connection), progress, cancellationToken).ConfigureAwait(false); return(context); }
/// <summary> /// Launch a synchronization with the specified mode /// </summary> public async Task <SyncResult> SynchronizeAsync(string scopeName, SyncSetup setup, SyncType syncType, SyncParameters parameters, CancellationToken cancellationToken, IProgress <ProgressArgs> progress = null) { // checkpoints dates var startTime = DateTime.UtcNow; var completeTime = DateTime.UtcNow; // Create a logger var logger = this.Options.Logger ?? new SyncLogger().AddDebug(); // Lock sync to prevent multi call to sync at the same time LockSync(); // Context, used to back and forth data between servers var context = new SyncContext(Guid.NewGuid(), scopeName) { // if any parameters, set in context Parameters = parameters, // set sync type (Normal, Reinitialize, ReinitializeWithUpload) SyncType = syncType }; // Result, with sync results stats. var result = new SyncResult(context.SessionId) { // set start time StartTime = startTime, CompleteTime = completeTime, }; this.SessionState = SyncSessionState.Synchronizing; this.SessionStateChanged?.Invoke(this, this.SessionState); //await Task.Run(async () => //{ try { if (cancellationToken.IsCancellationRequested) { cancellationToken.ThrowIfCancellationRequested(); } if (setup != null) { var remoteOrchestratorType = this.RemoteOrchestrator.GetType(); var providerType = remoteOrchestratorType.Name; if (providerType.ToLowerInvariant() == "webclientorchestrator" || providerType.ToLowerInvariant() == "webremotetorchestrator") { throw new Exception("Do not set Tables (or SyncSetup) from your client. Please use SyncAgent, without any Tables or SyncSetup. The tables will come from the server side"); } } // Begin session context = await this.LocalOrchestrator.InternalBeginSessionAsync(context, cancellationToken, progress).ConfigureAwait(false); if (cancellationToken.IsCancellationRequested) { cancellationToken.ThrowIfCancellationRequested(); } // no need to check on every call to SynchronizeAsync if (!checkUpgradeDone) { var needToUpgrade = await this.LocalOrchestrator.NeedsToUpgradeAsync(default, default, cancellationToken, progress).ConfigureAwait(false);
public SessionEndArgs(SyncContext context, SyncResult syncResult, DbConnection connection) : base(context, connection, null) { SyncResult = syncResult; }