|
|
|
@ -335,12 +335,30 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
|
|
|
|
|
trigger.Start(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Task _currentTask;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Executes the task
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns>Task.</returns>
|
|
|
|
|
/// <exception cref="System.InvalidOperationException">Cannot execute a Task that is already running</exception>
|
|
|
|
|
public async Task Execute()
|
|
|
|
|
{
|
|
|
|
|
var task = ExecuteInternal();
|
|
|
|
|
|
|
|
|
|
_currentTask = task;
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
await task.ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
_currentTask = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async Task ExecuteInternal()
|
|
|
|
|
{
|
|
|
|
|
// Cancel the current execution, if any
|
|
|
|
|
if (CurrentCancellationTokenSource != null)
|
|
|
|
@ -585,14 +603,60 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
|
|
|
|
|
{
|
|
|
|
|
DisposeTriggers();
|
|
|
|
|
|
|
|
|
|
if (State == TaskState.Running)
|
|
|
|
|
var wassRunning = State == TaskState.Running;
|
|
|
|
|
var startTime = CurrentExecutionStartTime;
|
|
|
|
|
|
|
|
|
|
var token = CurrentCancellationTokenSource;
|
|
|
|
|
if (token != null)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
Logger.Debug(Name + ": Cancelling");
|
|
|
|
|
token.Cancel();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
Logger.ErrorException("Error calling CancellationToken.Cancel();", ex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var task = _currentTask;
|
|
|
|
|
if (task != null)
|
|
|
|
|
{
|
|
|
|
|
OnTaskCompleted(CurrentExecutionStartTime, DateTime.UtcNow, TaskCompletionStatus.Aborted, null);
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
Logger.Debug(Name + ": Waiting on Task");
|
|
|
|
|
var exited = Task.WaitAll(new[] { task }, 2000);
|
|
|
|
|
|
|
|
|
|
if (exited)
|
|
|
|
|
{
|
|
|
|
|
Logger.Debug(Name + ": Task exited");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Logger.Debug(Name + ": Timed out waiting for task to stop");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
Logger.ErrorException("Error calling Task.WaitAll();", ex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (CurrentCancellationTokenSource != null)
|
|
|
|
|
if (token != null)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
Logger.Debug(Name + ": Disposing CancellationToken");
|
|
|
|
|
token.Dispose();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
Logger.ErrorException("Error calling CancellationToken.Dispose();", ex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (wassRunning)
|
|
|
|
|
{
|
|
|
|
|
CurrentCancellationTokenSource.Dispose();
|
|
|
|
|
OnTaskCompleted(startTime, DateTime.UtcNow, TaskCompletionStatus.Aborted, null);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|