【问题标题】: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();