AsnyncLocal與ThreadLocal都是存儲線程上下文的變量,可是,在實際使用過程當中二者又有區別主要的表如今:json
using System; using System.Threading; using System.Threading.Tasks; namespace await_aysnc { class Program { static ThreadLocal<int> ThreadObj = new ThreadLocal<int>(); static AsyncLocal<int> AsyncObj = new AsyncLocal<int>(); static void Main(string[] args) { AsyncObj.Value = 1; ThreadObj.Value = 1; Console.WriteLine($"Task執行前:AsyncObj= {AsyncObj.Value} ThreadObj= {ThreadObj.Value} ThreeadId = {Thread.CurrentThread.ManagedThreadId}"); Task.Run(async() => { Console.WriteLine($"RunAsync異步執行前:AsyncObj= {AsyncObj.Value} ThreadObj= {ThreadObj.Value} ThreeadId = {Thread.CurrentThread.ManagedThreadId}"); await RunAsync(); Console.WriteLine($"RunAsync異步執行後:AsyncObj = {AsyncObj.Value} ThreadObj= {ThreadObj.Value} ThreeadId = {Thread.CurrentThread.ManagedThreadId}"); }); Console.WriteLine($"Task執行後:AsyncObj= {AsyncObj.Value} ThreadObj= {ThreadObj.Value} ThreeadId = {Thread.CurrentThread.ManagedThreadId}"); Console.Read(); } static async Task RunAsync() { Console.WriteLine($"Delay異步執行前:AsyncObj = {AsyncObj.Value} ThreadObj= {ThreadObj.Value} ThreeadId = {Thread.CurrentThread.ManagedThreadId} "); AsyncObj.Value = 2; ThreadObj.Value = 2; await Task.Delay(100); Console.WriteLine($"Delay異步執行後:AsyncObj = {AsyncObj.Value} ThreadObj= {ThreadObj.Value} ThreeadId = {Thread.CurrentThread.ManagedThreadId}"); } } }
Task執行前:AsyncObj= 1 ThreadObj= 1 ThreeadId = 1 Task執行後:AsyncObj= 1 ThreadObj= 1 ThreeadId = 1 RunAsync異步執行前:AsyncObj= 1 ThreadObj= 0 ThreeadId = 3 Delay異步執行前:AsyncObj = 1 ThreadObj= 0 ThreeadId = 3 Delay異步執行後:AsyncObj = 2 ThreadObj= 0 ThreeadId = 4 RunAsync異步執行後:AsyncObj = 1 ThreadObj= 0 ThreeadId = 4
從結果上能夠看出一下結論:c#