我有一个长期运行的任务,其行为类似于事务 - 它涉及许多操作,其中一个的成功取决于另一个的成功。
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();
});
}
}
这只是实际应用程序的伪代码,其中不同的操作由系统的不同组件提供。有一个底层 GUI (WinForms) 使用进度条显示进度,并且无论发生什么都必须保持响应。事务都是长时间运行的,所以在启动任务时不需要指定它(使用TaskCreationOptions
),它总是在一个新线程中运行。使用事件将事务的进度报告回 GUI。
现在,有一个请求,如果在事务执行期间发生某些事情失败,它不会像当前那样立即回滚。他们希望在 GUI 中弹出一个消息框,让用户可以选择是否回滚或修复错误并从最后一个成功点继续。
所以我需要以某种方式实现阻塞。我认为我可以提出另一个事件,弹出一个消息框并说“嘿,修复它然后按确定”。并将 OK 点击事件绑定到我的外部管理器(公共 API),它可以将请求直接委托给我的事务。而阻塞只会主动运行一个while循环来检查一些布尔属性。
现在我认为被动阻塞会更好,但我真的不知道该怎么做。你能告诉我吗?
编辑:而且我真的不想使用Thread.Sleep
,因为这些错误可能需要不同的时间来修复。取决于错误和修复错误的人。