/// <summary> /// Creates an asynchronous Task object that executes the given plugin on a background thread and /// invokes all other callbacks (success, failure, etc.) on the UI thread. /// </summary> /// <param name="cancellationToken"></param> /// <param name="plugin"></param> /// <param name="pluginRunner"></param> /// <returns></returns> private Task<bool> RunPluginSync(CancellationToken cancellationToken, IPlugin plugin, ExecutePluginHandler pluginRunner) { var task = new TaskBuilder() .OnThread(_callbackScheduler) .CancelWith(cancellationToken) .BeforeStart(delegate { var progressProvider = _pluginRepository.GetProgressProvider(plugin); progressProvider.Updated -= ProgressProviderOnUpdated; progressProvider.Updated += ProgressProviderOnUpdated; progressProvider.Reset(); progressProvider.Start(); }) .DoWork(delegate(IThreadInvoker invoker, CancellationToken token) { pluginRunner(token); }) .Fail(delegate(ExceptionEventArgs args) { var progressProvider = _pluginRepository.GetProgressProvider(plugin); if (args.Exception is OperationCanceledException) { progressProvider.Cancel(); } else { progressProvider.Error(args.Exception); HandleUnhandledException(args.Exception); } }) .Succeed(delegate { var progressProvider = _pluginRepository.GetProgressProvider(plugin); if (cancellationToken.IsCancellationRequested) { progressProvider.Cancel(); } else { progressProvider.Succeed(); } }) .Build() ; task.RunSynchronously(); return task; }
/// <summary> /// Creates an asynchronous Task object that executes the given plugin on a background thread and /// invokes all other callbacks (success, failure, etc.) on the UI thread. /// </summary> /// <param name="cancellationToken"></param> /// <param name="plugin"></param> /// <param name="pluginRunner"></param> /// <returns></returns> private Task <bool> RunPluginSync(CancellationToken cancellationToken, IPlugin plugin, ExecutePluginHandler pluginRunner) { var task = new TaskBuilder() .OnThread(_callbackScheduler) .CancelWith(cancellationToken) .BeforeStart(delegate { var progressProvider = _pluginRepository.GetProgressProvider(plugin); progressProvider.Updated -= ProgressProviderOnUpdated; progressProvider.Updated += ProgressProviderOnUpdated; progressProvider.Reset(); progressProvider.Start(); }) .DoWork(delegate(IThreadInvoker invoker, CancellationToken token) { pluginRunner(token); }) .Fail(delegate(ExceptionEventArgs args) { var progressProvider = _pluginRepository.GetProgressProvider(plugin); if (args.Exception is OperationCanceledException) { progressProvider.Cancel(); } else { progressProvider.Error(args.Exception); HandleUnhandledException(args.Exception); } }) .Succeed(delegate { var progressProvider = _pluginRepository.GetProgressProvider(plugin); if (cancellationToken.IsCancellationRequested) { progressProvider.Cancel(); } else { progressProvider.Succeed(); } }) .Build() ; task.RunSynchronously(); return(task); }
private IPromise <bool> RunPluginSync(CancellationToken cancellationToken, IPlugin plugin, ExecutePluginHandler pluginRunner) { var promise = new SimplePromise(_uiContext) .CancelWith(cancellationToken) .Before(delegate { var progressProvider = _pluginRepository.GetProgressProvider(plugin); progressProvider.Updated -= ProgressProviderOnUpdated; progressProvider.Updated += ProgressProviderOnUpdated; progressProvider.Reset(); progressProvider.Start(); }) .Work(delegate { pluginRunner(cancellationToken); }) .Fail(delegate(IPromise <bool> p) { var progressProvider = _pluginRepository.GetProgressProvider(plugin); // Sanity check if (cancellationToken.IsCancellationRequested || progressProvider.State == ProgressProviderState.Canceled) { progressProvider.Cancel(); return; } progressProvider.Error(p.LastException); HandleUnhandledException(p.LastException); }) .Canceled(delegate { _pluginRepository.GetProgressProvider(plugin).Cancel(); }) .Done(delegate { var progressProvider = _pluginRepository.GetProgressProvider(plugin); if (cancellationToken.IsCancellationRequested) { progressProvider.Cancel(); } else { progressProvider.Succeed(); } }) ; promise.Start().Wait(); return(promise); }