2012-04-16 71 views
0

這是更多的「我想知道」類問題,而不是真正的問題。在Visual Studio中執行線程處理需要Join才能正常工作

在提高我的線程技能的同時,我遇到了以下難題。

的源代碼

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     var thread = new Thread(() => Print("Hello from t")); 
     thread.Start(); 
     //thread.Join(); 
    } 

    private static void Print(string message) 
    { 
     Console.WriteLine(message); 
    } 
} 

如果我運行從Visual Studio應用程序(無論它是調試或發佈配置),message永遠不會在顯示的問題輸出窗口除非我等待線程退出(使用Join)。

解決方案

運行編譯在命令提示符下執行的,你看到預期的輸出。

我的問題

我會扔胡亂猜測,說Visual Studio環境使所有的差異。

我想知道的是,如果我正在研究一個真實世界的應用程序,我將如何使用Visual Studio調試所述應用程序,而不必強制修改源代碼(使用Join)?

+0

在真實世界的應用程序中,當程序有可能仍然很忙的線程時,你會愚蠢地讓程序退出。 – 2012-04-16 20:56:32

+0

啊,啊!當然!謝謝大家的解釋。兩個答案都澄清了我的困惑。對不起,我只能標記一個作爲答案。 – 2012-04-16 21:02:27

回答

2

在實際應用程序中,此代碼不應出現,因爲在線程完成之前應用程序退出的問題。如果你確實有這個問題,它通常表示代碼存在問題。

如果您正在使用消息泵(WinForms)或類似的應用程序(WPF),應用程序將正常運行,這意味着它將不會退出,直到用戶(或應用程序)通過請求應用程序中斷循環出口。在這種情況下,線程將一直工作直到完成,或者直到程序退出。可能需要調用Thread.Join(),具體取決於場景。

如果您正在創建控制檯應用程序,應在程序結束時調用Thread.Join()以確保工作線程完成。另一種方法是使用System.Windows.Forms.Application.Run()啓動消息泵。但是,它不是爲此設計的,除非您與用戶進行交互,否則不應使用它。

另一方面,C#中有兩種線程:前臺線程和後臺線程。在主線程停止後,前臺線程繼續運行。後臺線程在所有前臺線程完成時停止。默認類型是前臺線程。您可以使用Thread.IsBackground屬性明確設置線程爲背景。Visual Studio顯然是與線程一起使用的,前景線程不會阻止應用程序退出。在調試器外運行該程序可以正常工作。

確保所有線程在主線程之前終止仍是一個好主意。誰知道如果在退出Main後運行更高級的代碼會發生什麼情況。

2

電話thread.Start()只是啓動輔助線程,然後返回。由於這是Main函數的結束,程序結束並且其進程在輔助線程有機會打印消息之前退出。

沒有神祕感,對於Visual Studio環境來說並不奇怪,只是正常的Windows進程行爲。

相關問題