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#