如何等待BackgroundWorker完成然后退出控制台应用程序

我已经编写了一个示例控制台应用程序来使用Stackoverflow中发布的示例之一来测试backgroundworker。 我有一个backgroundworker,它以main方法开头,但是如果我按下回车键,它会在操作过程中结束,因为我在main方法中写了一个console.readkey。 但我希望它等到后台工作者完成工作然后退出应用程序。 这是我的代码。

class Program { private static BackgroundWorker worker = new BackgroundWorker(); private event EventHandler BackgroundWorkFinished; static void Main(string[] args) { worker.DoWork += worker_DoWork; worker.RunWorkerCompleted += worker_RunWorkerCompleted; worker.ProgressChanged += worker_ProgressChanged; worker.WorkerReportsProgress = true; worker.WorkerSupportsCancellation = true; Console.WriteLine("Starting Application..."); worker.RunWorkerAsync(); Console.ReadKey(); } static void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { Console.WriteLine(e.ProgressPercentage.ToString()); } static void worker_DoWork(object sender, DoWorkEventArgs e) { Console.WriteLine("Starting to do some work now..."); int i; for (i = 1; i < 10; i++) { Thread.Sleep(1000); worker.ReportProgress(Convert.ToInt32((100.0 * i) / 10)); } e.Result = i; } static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { Console.WriteLine("Value Of i = " + e.Result.ToString()); Console.WriteLine("Done now..."); } } 

请参阅如何等待BackgroundWorker取消? 发布如何在BackgroundWorker和主线程之间进行通信。

基本上,您必须使用在DoWork结束时设置的事件来表示DoWork已完成。 然后在主线程中的那个事件上等待WaitOne()。

Bgw的主要目的是与Windows MessageQueue交互。 换句话说,它在WinForms和WPF应用程序中最有用。

控制台应用程序不是使用或测试Bgw的正确位置。 你会得到奇怪的结果。 在关键点打印ManagedThreadId以查看会发生什么。

还有一些标准建议:你的worker_RunWorkerCompleted()应该检查e.Error现在它与一个空的catch{}块相同。
当你阅读更复杂的e.Result ,现在会抛出来自DoWork的任何错误。

这就是我现在所做的。 但是console.readkey()无效。 应用程序不等待ReadKey()函数。

 class Program { private static BackgroundWorker worker = new System.ComponentModel.BackgroundWorker(); private static AutoResetEvent resetEvent = new AutoResetEvent(false); static void Main(string[] args) { worker.DoWork += worker_DoWork; worker.RunWorkerCompleted += worker_RunWorkerCompleted; worker.ProgressChanged += worker_ProgressChanged; worker.WorkerReportsProgress = true; Console.WriteLine("Starting Application..."); worker.RunWorkerAsync(); resetEvent.WaitOne(); Console.ReadKey(); } static void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { Console.WriteLine(e.ProgressPercentage.ToString()); } static void worker_DoWork(object sender, DoWorkEventArgs e) { Console.WriteLine("Starting to do some work now..."); int i; for (i = 1; i < 10; i++) { Thread.Sleep(1000); worker.ReportProgress(Convert.ToInt32((100.0 * i) / 10)); } e.Result = i; resetEvent.Set(); } static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { Console.WriteLine("Value Of i = " + e.Result.ToString()); Console.WriteLine("Done now..."); } } 

修复编辑:resetEvent.Set()移动到DoWork内部而不是RunWorkerCompleted中 。 由于主线程正在等待事件,因此永远不会调用Completed事件处理程序。