/// <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);
 }
예제 #2
0
        /// <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);
            }
        }