private void ExecuteTask(Task task) { currentTask = task; Power.ExecutionState = ExecutionState.Continuous | ExecutionState.SystemRequired; try { task.Canceled = false; task.OnTaskStarted(); foreach (ErasureTarget target in task.Targets) try { UnusedSpaceTarget unusedSpaceTarget = target as UnusedSpaceTarget; FileSystemObjectTarget fileSystemObjectTarget = target as FileSystemObjectTarget; if (unusedSpaceTarget != null) EraseUnusedSpace(task, unusedSpaceTarget); else if (fileSystemObjectTarget != null) EraseFilesystemObject(task, fileSystemObjectTarget); else throw new ArgumentException("Unknown erasure target."); } catch (FatalException) { throw; } catch (OperationCanceledException) { throw; } catch (ThreadAbortException) { } catch (Exception e) { Logger.Log(e.Message, LogLevel.Error); BlackBox.Get().CreateReport(e); } } catch (FatalException e) { Logger.Log(e.Message, LogLevel.Fatal); } catch (OperationCanceledException e) { Logger.Log(e.Message, LogLevel.Fatal); } catch (ThreadAbortException) { } catch (Exception e) { Logger.Log(e.Message, LogLevel.Error); BlackBox.Get().CreateReport(e); } finally { Power.ExecutionState = ExecutionState.Continuous; if (task.Schedule is RecurringSchedule) ((RecurringSchedule)task.Schedule).Reschedule(DateTime.Now); if (task.Schedule == Schedule.RunOnRestart) task.Schedule = Schedule.RunNow; task.OnTaskFinished(); currentTask = null; } }