我有以下wpf程序,我想要做的是btnAnalyzer_click方法,等待兩個DoWork & RunWorkerCompleted方法完成。所以我使用了一個AutoResetEvent,但現在bwAnalyze_click方法(#4行)在DoWork之後運行,然後運行WorkerCompleted方法(行順序 - #1#2#4 &#3)。但是我希望他們能按照#1#2#3 &#4的順序執行。任何解決方案或建議?後臺工作人員RunWorkCompleted事件
public partial class MainWindow : Window
{
private readonly BackgroundWorker bwAnalyzer = new BackgroundWorker();
private AutoResetEvent autoReset;//to signal the end of the BackgroudnWork
public MainWindow()
{
InitializeComponent();
autoReset = new AutoResetEvent(false);
bwAnalyzer.DoWork += new DoWorkEventHandler(DoWork);
bwAnalyzer.RunWorkerCompleted += new RunWorkerCompletedEventHandler(WorkerCompleted);
}
void WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Console.WriteLine("Completed"); #3
autoReset.Set();
}
void DoWork(object sender, DoWorkEventArgs e)
{
Console.WriteLine("load"); #2
}
private void btnAnalyze_Click(object sender, RoutedEventArgs e)
{
bwAnalyzer.RunWorkerAsync(); #1
autoReset.WaitOne();//when commented working properly
Console.WriteLine("click"); #4
}
}
是的,我明白你的觀點,等待和使用後臺工作者是無用的。我正在編輯存在的代碼庫,所以刪除後臺工作者似乎很多工作。所以我試圖改變點擊的順序,並使用後臺工作完成...... – maamaa
我明白了!那麼最簡單的方法是將RunWorkerAsync後面的所有內容移動到一個新的方法中,然後在WorkerCompleted()中調用它...然後保證線性執行而不會阻塞任何東西。雖然我必須說我爲維護而感到有點像這樣的代碼:) – Rowbear
@Rowbear:如果您正在編輯現有代碼,爲什麼不改進設計,因爲您有機會? :) ['「讓露營地比你找到的地方更清潔。」](http://alvinalexander.com/programming/clean-code-quotes-robert-c-martin) –