/// <summary> /// Start the task in a new thread /// </summary> /// <param name="dispatcher"></param> public void StartNew(IBackgroundTask <StorageContext> dispatcher) { Task.Factory.StartNew(() => dispatcher.Execute(_context), CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default); }
/// <summary> /// Run a background task. /// </summary> /// <param name="action"></param> public void RunBackgroundTask(IBackgroundTask action) { var actionId = action.Id ?? System.Guid.NewGuid().ToString("N"); var cancelationTokenSource = new CancellationTokenSource(); var token = cancelationTokenSource.Token; var asyncState = new JobState(); asyncState.Id = actionId; asyncState.BackgroundTask = action; asyncState.CancellationToken = token; var jobTask = new Task(action: (state) => { try { action.Execute(token); } catch (Exception ex) { Logger.Current.Write(LogLevel.Critical, ex.ToString()); } }, state: asyncState, cancellationToken: token); _runningJobCancellationTokens.AddOrUpdate(actionId, cancelationTokenSource, (str, cts) => { return(cancelationTokenSource); }); //we need this handler to only fire once, even though the job could be long lived and fire every often action.Complete -= _onComplete; action.Complete += _onComplete; jobTask.Start(); _runningJobs.AddOrUpdate(actionId, jobTask, (str, j) => { return(jobTask); }); _runningJobStartTimes.AddOrUpdate(actionId, DateTime.UtcNow, (str, dt) => { return(DateTime.UtcNow); }); }
public static void ExecuteTask(IBackgroundTask backgroundTask) { if (!Properties.Settings.Default.BackgroundTasksEnabled) return; try { backgroundTask.Execute(); } catch (TaskCanceledException) { } catch (Exception exception) { ExceptionsHandler.Handle(exception, backgroundTask); } }