[Day7]C#建立不會停止的背景Task

前言

在上回 Post not found: Task運行處理-Run、Start、RunSynchronously-C-SyncAndAsync [Day6]Task運行處理(Run、Start、RunSynchronously) ,我們學習了Task的各種啟動方式。
而今回主要來撰寫不會停止的背景Task。

實作

不終止的非同步事件 ex:多個while(true)常駐。

主要使用以下的模板去製作常駐程式:

1
2
3
4
5
6
7
var endlessTask = Task.Run(async () =>
{
while (true)
{
// Todo
}
});

簡單來說就是開一個異步的Task讓他跑即可。

在以下的範例中endlessTask1、endlessTask2會不停的印出資料。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;
using System.Threading.Tasks;

namespace EndlessTaskAsync
{
class Program
{
/// <summary>
/// 主程式
/// </summary>
/// <returns></returns>
public static async Task Main()
{
var endlessTask1 = EndlessTask(1);
var endlessTask2 = EndlessTask(2);

await PreventToStop();
}

/// <summary>
/// 製作無止盡的 while task
/// </summary>
/// <param name="number">編號</param>
/// <returns></returns>
private static Task EndlessTask(int number)
{
Console.WriteLine("Start EndlessTask" + number);
var endlessTask = Task.Run(async () =>
{
while (true)
{
Console.WriteLine("EndlessTask" + number);
await Task.Delay(100);
}
});
return Task.CompletedTask;
}

/// <summary>
/// 避免視窗關閉,使用ReadKey();
/// </summary>
/// <returns></returns>
private static Task PreventToStop()
{
Console.ReadKey();
return Task.CompletedTask;
}
}
}

運行結果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
EndlessTask1
EndlessTask2
EndlessTask1
EndlessTask2
EndlessTask1
EndlessTask2
EndlessTask1
EndlessTask2
EndlessTask1
EndlessTask2
EndlessTask1
EndlessTask2
EndlessTask1
EndlessTask2
EndlessTask1
EndlessTask2
EndlessTask1
EndlessTask2

直到關掉程式都會一直印。

總結

在這回中練習了背景常駐的Task,通常會在監聽某個請求while中使用。
如果是以目前處理過的code,就是在socket處理上會大量使用。

專案存庫:
https://github.com/yuhsiang237/EndlessTaskAsync