在BackgroundWorker doWork事件中使用Console.WriteLine

时间:2011-05-29 03:24:23

标签: c# .net winforms console backgroundworker

我有一个控制台应用程序,它利用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);
    }
}

为什么应用程序似乎会退出这样的想法?

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

对于backgroundworkerWorkerReportsProgresstrue。订阅这样的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);
}

答案 2 :(得分:2)

我可能无法正确理解您的设置。我猜你正在运行后台线程,但是主进程正在退出,导致线程在它做任何事情之前被停止。也许尝试在主进程中添加一些东西,防止主线程像Console.ReadKey();

一样退出