2011-05-29 38 views
4

我有一個控制檯應用程序,它利用BackgroundWorker對象並想用Console.WriteLine(fooBar)測試我的輸出。但是,該應用程序會在應用程序執行Console.WriteLine命令時退出。在BackgroundWorker doWork事件中使用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

背景工作在控制檯應用程序中並不是非常有用。 – 2011-05-29 08:02:00

回答

2

對於你的backgroundworker設置WorkerReportsProgresstrue。訂閱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線程,那麼你可以做這樣的事情:

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

的應用程序退出,因爲它實際上完成了執行並且沒有更多的工作要做;-)一旦你安排了後臺工作者並且啓動了線程來完成它的工作,你就必須告訴主線程停下來等待一件事或者另一件事。這樣做的一種非常常見的方式(通常用於測試/示例代碼)是簡單地發出Console.ReadKey();作爲主方法中最後一行代碼。這將導致您的應用程序等待,直到您退出該過程之前按下某個鍵。

2

我可能不會正確理解您的設置。我猜你正在運行後臺線程,但主進程正在退出,導致線程在進行任何操作之前停止。也許嘗試在你的主進程中加入一些防止主線程退出的東西,比如Console.ReadKey();

相關問題