【问题标题】:Using Console.WriteLine in a BackgroundWorker doWork event在 BackgroundWorker doWork 事件中使用 Console.WriteLine
【发布时间】:2011-05-29 03:24:23
【问题描述】:

我有一个使用 BackgroundWorker 对象的控制台应用程序,并希望使用 Console.WriteLine(fooBar) 测试我的输出。但是,该应用程序会在应用程序执行 Console.WriteLine 命令时退出。

这是一个淡化的版本,说明了我想做的事情:

protected static void bWorker_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = startId; i <= endId; i++)
    {
        Console.WriteLine(i.ToString());
        Thread.Sleep(1000);
    }
}

任何想法为什么应用程序会出现这样的退出?

【问题讨论】:

  • 后台工作者在控制台应用程序中不是很有用。

标签: c# .net winforms console backgroundworker


【解决方案1】:

应用程序退出是因为它实际上已完成执行并且没有更多工作要做;-) 一旦你安排了后台工作程序并启动线程来做这件事,你必须告诉主线程停止并等待一件事或另一件事。执行此操作的一种非常常见的方法(通常用于测试/示例代码)是简单地发出 Console.ReadKey(); 作为 main 方法中的最后一行代码。这将导致您的应用程序等到您按下某个键后再退出进程。

【讨论】:

    【解决方案2】:

    对于您的backgroundworker,将WorkerReportsProgress 设置为true。像这样订阅ProgressChanged 事件:

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        for (var i = 0; i < 1000; i++)
        {
            backgroundWorker1.ReportProgress(i);
        }
    }
    
    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        Console.WriteLine(e.ProgressPercentage);
    }
    

    如果您不仅需要将 int 从后台线程传输到 UI 线程,那么您可以执行以下操作:

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        for (var i = 0; i < 1000; i++)
        {
            var myObjectInstance = new MyObject{ ...};
            backgroundWorker1.ReportProgress(null, myObjectInstance);
        }
    }
    
    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        var myObjectInstance = (MyObject)e.UserState;
        Console.WriteLine(myObjectInstance);
    }
    

    【讨论】:

      【解决方案3】:

      我可能没有正确理解您的设置。我猜你正在运行后台线程,但是主进程正在退出,这导致线程在它开始做任何事情之前就停止了。也许尝试在你的主进程中加入一些东西来阻止主线程退出,比如 Console.ReadKey();

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-01
        • 2011-04-15
        • 2012-03-27
        • 2013-05-24
        • 2021-01-03
        相关资源
        最近更新 更多