/// <summary> /// Выполнить синхронизацию. /// </summary> public void Sync( ISyncContext context, TSvc svc, int retries, ITaskIndicator indicator) { if (context == null) throw new ArgumentNullException("context"); if (svc == null) throw new ArgumentNullException("svc"); if (indicator == null) throw new ArgumentNullException("indicator"); indicator.SetTaskState(SyncTaskState.Sync); try { context.CheckState(); indicator.SetStatusText(SyncResources.IndicatorPrepareRequest); var rq = PrepareRequest(context); if (rq == null) return; // Nothing to do context.CheckState(); indicator.SetStatusText(SyncResources.IndicatorMakeRequest); var rsp = context.CallWithRetries(rq, GetDisplayName(), retries, () => MakeRequest(context, svc, rq)); context.CheckState(); indicator.SetStatusText(SyncResources.IndicatorProcessResponse); ProcessResponse(context, rq, rsp); context.CheckState(); indicator.SetTaskState(SyncTaskState.Succeed); indicator.SetStatusText(SyncResources.IndicatorSuccessFinish); } // Отмену пользователем не трактуем как ошибку и выкидываем наверх catch (UserCancelledException) { throw; } catch (Exception ex) { indicator.SetTaskState(SyncTaskState.Failed); indicator.SetStatusText(ex.Message); context.TryAddSyncError( new SyncErrorInfo(SyncErrorType.CriticalError, GetDisplayName(), ex.ToString())); } }
protected static void InitTransferProgress(ISyncContext context, T svc) { var notificator = svc as ITransferNotificator; if (notificator == null) { return; } var progressProv = context.GetService <ISyncProgressVisualizer>(); if (progressProv == null) { return; } notificator.TransferBegin += (total, direction, state) => { context.CheckState(); progressProv.ReportProgress(total, 0); var progressTextFormat = (direction == TransferDirection.Receive ? SyncResources.Receiving : SyncResources.Sending) + " {0}/{1}"; progressProv.SetProgressText( progressTextFormat.FormatStr(0, total.ToInfoSizeString())); progressProv.SetCompressionSign(state); }; notificator.TransferProgress += (total, current, direction) => { context.CheckState(); progressProv.ReportProgress(total, current); var progressTextFormat = (direction == TransferDirection.Receive ? SyncResources.Receiving : SyncResources.Sending) + " {0}/{1}"; progressProv.SetProgressText( progressTextFormat .FormatStr( current.ToInfoSizeString(), total.ToInfoSizeString())); }; notificator.TransferComplete += (total, direction) => progressProv.SetCompressionSign(CompressionState.Off); }
/// <summary> /// Запустить периодические задачи. /// </summary> public void SyncPeriodicTasks(ISyncContext context) { PerformSyncProvider(context, svc => GetPeriodicTaskNames() .Select(name => _tasks[name]) // Выбираем все периодические задачи .Where(task => task.IsTaskActive()) // Отфильтровываем неактивные .Select( task => new { Task = task, Indicator = context.AppendTaskIndicator(task.GetDisplayName()) }) // Создаем индикаторы .ToArray() // Сразу выполняем. чтобы все индикаторы добавились до начала синхронизации .ForEach( data => { data.Task.Sync(context, svc, _webConSvc.GetConfig().RetriesCount, data.Indicator); context.CheckState(); })); }
public static TRsp CallWithRetries <TRq, TRsp>( this ISyncContext context, TRq request, string taskName, int retriesCount, Func <TRsp> requestMaker) { var resp = default(TRsp); var retries = retriesCount + 1; while (retries-- > 0) { try { resp = requestMaker(); } // Отмену пользователем не трактуем как ошибку и выкидываем наверх catch (UserCancelledException) { throw; } catch (Exception ex) { if (retries > 0) { context.LogWarning(SyncResources.ErrorMessage.FormatStr(ex.Message)); context.TryAddSyncError( new SyncErrorInfo(SyncErrorType.Warning, taskName, ex.ToString())); context.CheckState(); continue; } throw; } break; } return(resp); }
protected override PostResponse MakeRequest(ISyncContext context, JanusAT svc, PostRequest rq) { svc.PostChange(rq); context.CheckState(); return(svc.PostChangeCommit()); }