代码之家  ›  专栏  ›  技术社区  ›  Soham Dasgupta

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

  •  17
  • Soham Dasgupta  · 技术社区  · 14 年前

    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...");
        }
    }
    
    3 回复  |  直到 14 年前
        1
  •  12
  •   Community Fabien Hure    7 年前

    看到了吗 How to wait for a BackgroundWorker to cancel? 关于如何在后台工作人员和主线程之间进行通信的帖子。

    基本上,您必须使用在DoWork结束时设置的事件来表示DoWork已经完成。然后在主线程中对该事件执行WaitOne()。

        2
  •  4
  •   Henk Holterman    10 年前

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

    还有一些标准建议:你的 worker_RunWorkerCompleted() 应该检查一下 e.Error 现在它就像有一个空的 catch{} 阻止。
    e.Result ,处理起来更复杂。

        3
  •  3
  •   Manos Nikolaidis Airsource Ltd    9 年前

    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() 到里面去 嫁妆 Runworker已完成 . 这个 完整的 永远不会调用事件处理程序,因为主线程正在等待事件。