我有一個長期運行的任務,其行爲像一個事務 - 它涉及許多操作,其中一個成功取決於另一個的成功。暫停任務執行
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
,因爲這些錯誤可能需要不同的時間來解決。取決於錯誤和修復它的人。
我不明白'event'的想法有什麼問題嗎? –
「事件」的想法沒有錯。該activelly等待while循環有一個問題。我想用被動等待。 –
我的答案如何? –