一般來說線程都是有自己上下文,變量是不共享的,這就需要線程本地存儲

public static class TlsSample { [ThreadStatic] public static int a; [ThreadStatic] public static int b; public static void Thread1() { a = 1; b = 2; Console.WriteLine($"a={a} [From Thread1]"); Console.WriteLine($"b={b} [From Thread1]"); } public static void Thread2() { a = 10; b = 20; Console.WriteLine($"a={a} [From Thread2]"); Console.WriteLine($"b={b} [From Thread2]"); } public static void Run() { var thread1 = new Thread(Thread1); var thread2 = new Thread(Thread2); thread1.Start(); thread2.Start(); } }
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
public class ThreadLocalSample { public readonly ThreadLocal a = new ThreadLocal(); public readonly ThreadLocal b = new ThreadLocal(); public void Thread1() { a.Value = 1; b.Value = 2; Console.WriteLine($"a={a} [From Thread1]"); Console.WriteLine($"b={b} [From Thread1]"); } public void Thread2() { a.Value = 10; b.Value = 20; Console.WriteLine($"a={a} [From Thread2]"); Console.WriteLine($"b={b} [From Thread2]"); } public void Run() { var thread1 = new Thread(Thread1); var thread2 = new Thread(Thread2); thread1.Start(); thread2.Start(); } }
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
異步本地變量AsyncLocal(執行上下文)
public static class Sample07 { private static readonly ThreadLocal ThreadLocal = new ThreadLocal(); private static readonly AsyncLocal AsyncLocal = new AsyncLocal(); public static async Task Run() { ThreadLocal.Value = 10; AsyncLocal.Value = 10; Console.WriteLine($"Tid={Thread.CurrentThread.ManagedThreadId};" + $"ThreadLocal={ThreadLocal.Value};" + $"AsyncLocal={AsyncLocal.Value}"); await Task.Delay(1000); Console.WriteLine($"Tid={Thread.CurrentThread.ManagedThreadId};" + $"ThreadLocal={ThreadLocal.Value};" + $"AsyncLocal={AsyncLocal.Value}"); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
不變性值類型子任務異步變量修改不會變,引用會
public static class Sample08 { private static readonly AsyncLocal AsyncLocal = new AsyncLocal(); public static async Task ParentTask() { AsyncLocal.Value = 111; Console.WriteLine($"ParentTask Begin:AsyncLocal={AsyncLocal.Value}"); await ChildTask(); Console.WriteLine($"ParentTask End:AsyncLocal={AsyncLocal.Value}"); } public static async Task ChildTask() { Console.WriteLine($"ChildTask Begin:AsyncLocal={AsyncLocal.Value}"); AsyncLocal.Value = 222; await Task.Delay(1000); Console.WriteLine($"ChildTask End:AsyncLocal={AsyncLocal.Value}"); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
禁止捕捉執行上下文,則無法傳遞到其他線程
public static class Sample11 { private static readonly AsyncLocal AsyncLocal = new AsyncLocal(); public static async Task ParentTask() { AsyncLocal.Value = 111; Console.WriteLine($"ParentTask Begin:AsyncLocal={AsyncLocal.Value}"); // 禁止捕捉執行上下文 var control = ExecutionContext.SuppressFlow(); Task.Delay(100).ContinueWith(task => { Console.WriteLine($"SuppressFlow:AsyncLocal={AsyncLocal.Value}"); }); // 恢復捕捉上下文 control.Undo(); // 捕捉到的執行上下文為null await Task.Delay(100); Console.WriteLine($"Undo:AsyncLocal={AsyncLocal.Value}"); } }
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
.NET 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。