在BackgroundWorker的doWork事件中使用Console.WriteLine

4

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

有什么想法,为什么应用程序会像那样退出?

1
在控制台应用程序中,BackgroundWorker 并不是非常有用。 - H H
3个回答

6

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


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);
}

如果您需要从后台线程向UI线程传输不止int类型的数据,那么您可以像这样做:
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

我可能没有正确理解你的设置。我猜想你正在运行后台线程,但主进程正在退出,这会导致线程在执行任何操作之前停止。也许尝试在主进程中放置一些东西来防止主线程退出,比如 Console.ReadKey();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接