Home [C# 筆記] Threading - C# Difference Between Background and Foreground Thread
Post
Cancel

[C# 筆記] Threading - C# Difference Between Background and Foreground Thread

C# Difference Between Background and Foreground Thread

Foreground Thread (前景執行緒)

若主程序已下達中止工作命令了,有任一前景執行緒尚未完成工作,程序不會立即中止,需待前景執行緒完成工作後才會終止。

在預設的狀況下Thread是屬於「前景執行緒」也就是Thread.IsBackground=false

下面範例,當主執行緒(Main())結束,控制台印出”Leaving Main”後,
另一個執行緒還會繼續執行,這就是Foreground Thread (前景執行緒)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
internal class Program
{
    //Main是主線程的線程
    static void Main(string[] args)
    {
        for (int i = 0; i < Environment.ProcessorCount; i++)
        {
            var thread = new Thread(DifferentMethod); //建立另一個線程
            thread.Start(i); //開始線程
        }
        Console.WriteLine("Leaving Main");
    }

    //另一個線程的開始
    static void DifferentMethod(object? threadID) {
        while (true) {
            Console.WriteLine($"Hello from different method: {threadID}");
        }
    }
}

執行結果:

主執行緒Main()已經結束了,另一個執行緒依然續繼執行,
這就是Foreground Thread (前景執行緒)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Hello from different method: 1
Leaving Main --> 主執行緒Main()已經結束了,另一個線程依然續繼執行,這就是Foreground Thread (前景執行緒)
Hello from different method: 0
Hello from different method: 1
Hello from different method: 0
Hello from different method: 1
Hello from different method: 0
Hello from different method: 1
Hello from different method: 1
Hello from different method: 0
Hello from different method: 1
Hello from different method: 0
Hello from different method: 0
.... //另一個執行緒 還會繼續執行

Background Thread (背景執行緒)

背景執行緒不管工作有沒有完成,一但收到中止命令,馬上就停下手邊的工作中止工作。

下面範例,將新建立的執行緒設為「背景執行緒」thread.IsBackground = true;
F5執行…可以看到

當主執行緒(Main())已經結束,在控制台印出離開主線程”Leaving Main”後, 另一個執行緒立即結束。

也就是說,一旦離開主執行緒Main()後,所有其他的執行緒都被關閉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
internal class Program
{
    //Main是主線程的線程
    static void Main(string[] args)
    {
        for (int i = 0; i < Environment.ProcessorCount; i++)
        {
            var thread = new Thread(DifferentMethod); //建立另一個線程
            thread.IsBackground = true; //設為背景執行緒
            thread.Start(i); //開始線程
        }
        Console.WriteLine("Leaving Main");
    }

    //另一個線程的開始
    static void DifferentMethod(object? threadID) {
        while (true) {
            Console.WriteLine($"Hello from different method: {threadID}");
        }
    }
}

執行結果:

主執行緒Main()已結束,另一個執行緒也會立即關閉結束,不再執行。
這就是Background Thread (背景執行緒)

1
2
3
4
5
6
Hello from different method: 0
Hello from different method: 0
Hello from different method: 1
Leaving Main ==> 主執行緒Main()已結束,另一個執行緒也會立即關閉結束
Hello from different method: 0
Hello from different method: 1

Thread.CurrentThread.ManagedThreadId

可以使用 Thread.CurrentThread.ManagedThreadId
顯示出當時正在執行的受管理的執行緒ID代碼,讓你清楚現在的是使用哪個執行緒來執行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
internal class Program
{
    //Main是主線程
    static void Main(string[] args)
    {
        Console.WriteLine(Thread.CurrentThread.ManagedThreadId);

        for (int i = 0; i < Environment.ProcessorCount; i++)
        {
            var thread = new Thread(DifferentMethod); //建立另一個線程
            thread.IsBackground = true; //設為背景執行緒
            thread.Start(i); //開始線程
        }
        Console.WriteLine("Leaving Main");
    }

    //另一個線程的開始
    static void DifferentMethod(object? threadID) {
        while (true) {
            Console.WriteLine($"Hello from different method: {Thread.CurrentThread.ManagedThreadId}");
        }
    }
}

C# Difference Between Background and Foreground Thread
[C#.NET][Thread] 背景執行緒與前景執行緒的差別
[C# 筆記] Threading - C# Hello World Thread
[C# 筆記] Threading - C# Multiple Threads

This post is licensed under CC BY 4.0 by the author.