我有一个控制台应用程序,它利用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);
}
}
为什么应用程序似乎会退出这样的想法?
答案 0 :(得分:5)
应用程序退出,因为它实际上完成了执行并且没有更多的工作要做;-)一旦你安排后台工作程序并启动线程来做它的事情,你必须告诉主线程停止并等待一件事或另一件事。执行此操作的一种非常常见的方法(通常用于测试/示例代码)是简单地发出Console.ReadKey();
作为main方法中的最后一行代码。这将导致您的应用程序等到您在退出流程之前按下某个键。
答案 1 :(得分: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);
}
答案 2 :(得分:2)
我可能无法正确理解您的设置。我猜你正在运行后台线程,但是主进程正在退出,导致线程在它做任何事情之前被停止。也许尝试在主进程中添加一些东西,防止主线程像Console.ReadKey();
一样退出