對不起,問這個很愚蠢的問題,但我讓這個程序測試是否所有前景線程都等待在程序終止前完成。.NET應用程序在終止程序之前是否等待所有前景線程完成?
但是在這個程序中,只要我點擊任何鍵退出程序,主線程就會終止,然後關閉應用程序,即使在執行其他前臺線程的過程中也是如此。
using System;
using System.Threading;
namespace ForegroundThreads
{
// This is a program to test whether or not the application
// will terminate when there is a pending foreground thread running.
// In describing the difference between foreground and background threads,
// the documentation states that an application will terminate all
// background threads when all foreground threads have finished execution.
// This implies that the application will stall the main thread until
// all foreground threads have completed execution. Let us see if this
// is the case.
// Quote:
// A managed thread is either a background thread or a foreground thread.
// Background threads are identical to foreground threads with one exception:
// a background thread does not keep the managed execution environment running.
// Once all foreground threads have been stopped in a managed process (where the .exe file is a managed assembly),
// the system stops all background threads and shuts down.
// Source: https://msdn.microsoft.com/en-us/library/h339syd0%28v=vs.110%29.aspx
class Program
{
static void Main(string[] args)
{
var t = new Thread(() => { 1000000.Times(() => { Console.WriteLine("Hello"); }); });
t.Start();
Console.WriteLine("Press any key to exit the main thread...");
Console.ReadKey();
}
}
public static class Extensions
{
public static void Times(this int numTimes, Action action)
{
for (int i = 0; i < numTimes; i++, action()) ;
}
}
}
我注意到,當我運行此代碼
在我的機器,如果我減少次數,以較小的值,比如,1000行爲,它會立即殺死所有前臺線程時主線程退出。但是,如果我將值設得很大,例如100萬,那麼系統會繼續運行我創建的前臺線程,忽略所有擊鍵,直到完成一百萬次打印。
更新
GSerg掛鉤,要求同樣的事情,另外一個問題。但是,如果你仔細閱讀這個問題,那個問題的海報真的在問:「發生了什麼事?」
答案只是引用MSDN解釋所有前臺線程正在等待。我的問題是爭論的。
我的問題是 - 爲什麼程序等待前景線程有時完成,而在其他時間沒有。因此,在另一個問題中的答案對我沒有任何幫助。
我無法複製。如果我將線程保持爲前景,當按Enter鍵時程序不會終止。如果我將其IsBackground屬性設置爲true,程序會終止。 –
嘗試更改'Times'方法的接收者的值。我正在更新這個問題,並提供更多的細節,以便它等待前景線程完成,以及何時不完成。在我的機器上,如果我將次數減少到一個較小的值,例如1000,它會在主線程退出時立即殺死所有前臺線程。但是,如果我將值設得很大,例如100萬,那麼系統會繼續運行我創建的前臺線程,忽略所有擊鍵,直到完成一百萬次打印。 –
使用Thread.Sleep()而不是Console.Writeline()可能更可靠。 –