C# 多线程 03-使用线程池 02-向线程池中放入异步操作
🏷️ 《C# 多线程》
csharp
/// <summary>
/// 向线程池中放入异步操作
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
const int x = 1;
const int y = 2;
const string lambdaState = "lambda state 2";
// 使用 QueueUserWorkItem 方法将 AsyncOperation 方法放到线程池中
ThreadPool.QueueUserWorkItem(AsyncOperation);
Thread.Sleep(TimeSpan.FromSeconds(3));
// 带参数的调用(参数值传递到 AsyncOperation 方法的参数 object state)
ThreadPool.QueueUserWorkItem(AsyncOperation, "async state");
// 使线程睡眠,从而让线程池拥有为新操作重用线程的可能性
Thread.Sleep(TimeSpan.FromSeconds(3));
// 使用 lamda 表达式放置到线程池
ThreadPool.QueueUserWorkItem(state =>
{
Console.WriteLine($"操作状态:{state}");
Console.WriteLine($"当前工作线程 Id:{Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(TimeSpan.FromSeconds(2));
}, "lambda state");
// 这个 lambda 表达式中使用了闭包机制,从而无须传递 lambda 表达式的状态
// 闭包更灵活,允许我们向异步方法传递一个以上的对象,而且这些对象具有静态类型
ThreadPool.QueueUserWorkItem(_ =>
{
Console.WriteLine($"操作状态:{x + y}, {lambdaState}");
Console.WriteLine($"当前工作线程 Id:{Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(TimeSpan.FromSeconds(2));
});
Thread.Sleep(TimeSpan.FromSeconds(2));
}
private static void AsyncOperation(object state)
{
Console.WriteLine($"操作状态:{state ?? "(null)"}");
Console.WriteLine($"当前工作线程 Id:{Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(TimeSpan.FromSeconds(2));
}
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
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
打印结果:
操作状态:(null)
当前工作线程Id:3
操作状态:async state
当前工作线程Id:4
操作状态:lambda state
当前工作线程Id:3
操作状态:3, lambda state 2
当前工作线程Id:4
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8