我使用一個BackgroundWorker在我的WinForms應用程序來執行發生在另一個類(執行數據庫操作)長時間運行的任務。由於所有的工作都是在另一個班級完成的,取消並不是那麼簡單。我正在使用其他課程中的事件(GenerateStats
)在後臺操作完成時更新進度。我想通過取消操作來做類似的事情。我不能只叫cancellationPending
在DoWork的功能,因爲該方法將永遠看不到它,直到它完成和失敗的目的。我希望取消功能不需要將BackgroundWorker傳遞給generateForSubject()
。反正是有,這可以支持從generateForSubject()
方法消除在GenerateStats
類。這是類的實例化的操作執行中:的BackgroundWorker取消
GenerateStats genStats = new GenerateStats();
這是我的DoWork函數,該函數調用ReportProgress
方法隨時在其他類的事件被調用。它還調用執行操作的其他類generateForSubject()
的方法。
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
genStats.ProgressChanged += (s, pe) => worker.ReportProgress(pe.ProgressPercentage, pe.UserState);
genStats.generateForSubject();
}
這是按鈕單擊事件處理程序,應啓動撤銷和運行CancelAsync()
private void btnStop_Click(object sender, EventArgs e)
{
if (backgroundWorker.IsBusy)
{
backgroundWorker.CancelAsync();
}
}
這是我獨立的類執行該操作,以創建ProgressChanged事件處理一起,所以我的班能更新了有關進展情況的表格。如果取消可以類似地執行,那將是非常棒的。
public event ProgressChangedEventHandler ProgressChanged;
protected virtual void OnProgressChanged(int progress, string message)
{
if (ProgressChanged != null)
{
ProgressChanged(this, new ProgressChangedEventArgs(progress, message));
}
}
public void generateForSubject()
{
//Perform db operation not important, but it takes time
OnProgressChanged(33, "Finished 1st set of stats");
//I hope to check for cancellation here
//Perform db operation not important, but it takes time
OnProgressChanged(66, "Finished 2nd set of stats");
//I hope to check for cancellation here
//Perform db operation not important, but it takes time
OnProgressChanged(99, "Finished 3rd set of stats");
//I hope to check for cancellation here
}
只是爲了澄清,如果有任何不確定性是什麼我問,有沒有什麼辦法,我支持我在其他類的BackgroundWorker取消,而沒有經過的BackgroundWorker的方法。如果是絕對沒有辦法,我要的話,我會通過的BackgroundWorker
該方法如何知道任何有關CancellationPending而不傳遞backgroundWorker? – frontin 2014-11-24 05:13:32
那是什麼。你需要在generateForSubject方法中有這個。並且在每個主要操作之前檢查它。這是我所知道的。 – 2014-11-24 05:14:50
由於OP不希望傳遞後臺工作,所以不會工作。 – prem 2014-11-24 05:16:47