У меня длинная работа, которая ведет себя как транзакция - она включает в себя множество операций, в которых успех одного зависит от успеха другого.Приостановить выполнение задачи
class MyTransaction
{
public void Execute()
{
StopServices();
BackupFiles();
OverwriteFiles();
BackupDatabases();
RunChangeScripts();
... and few others
}
public void RollBack() { }
}
class MyTransactionManager
{
public RunTransactions()
{
Task.Factory.StartNew(() => {
new MyTransaction().Execute();
});
}
}
Это просто псевдо-код реального приложения, где различные операции обеспечиваются различными компонентами системы. Существует базовый графический интерфейс (WinForms), который отображает прогресс, используя индикатор прогресса и несколько других вещей, которые должны оставаться отзывчивыми независимо от того, что происходит. Транзакции все очень долго работают, поэтому нет необходимости указывать его при запуске задач (используя TaskCreationOptions
), он всегда запускается в новом потоке. Прогресс от транзакций сообщается в графический интерфейс с использованием событий.
Теперь есть запрос, что если что-то во время выполнения транзакции не удастся, он не будет немедленно откатываться назад, как это происходит в настоящее время. Они хотят всплывать окно сообщения в графическом интерфейсе, предоставляя пользователю возможность решить, откатываться или исправлять ошибку и продолжать работу с последней успешной точки.
Так что мне нужно как-то реализовать блокировку. Я думал, что могу просто поднять еще одно событие, вскрыть окно сообщения и сказать «Эй, исправить, а затем нажать« ОК ». И свяжите это событие ОК с моим внешним менеджером (public API), который может делегировать запросы непосредственно моим транзакциям. И блокировка просто активно запускает цикл while, проверяющий свойство bool.
Теперь я думаю, что пассивная блокировка будет лучше, но я действительно не знаю, как это сделать. Не могли бы вы посоветовать мне?
EDIT: И я действительно не хочу использовать Thread.Sleep
, потому что эти ошибки могут занять некоторое время, чтобы исправить. Зависит от ошибки и человека, который ее исправляет.
Я не понимаю, что случилось с идеей 'event'? –
В идее 'event' нет ничего плохого. Существует проблема с тем, что activelly ожидает цикл while. Я хотел бы использовать пассивное ожидание. –
Как насчет моего ответа ниже? –