.NET/C# 中 ThreadLocal<T> 和 AsyncLocal<T> 的区别

in 编程
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

System.Threading.ThreadLocal<[NullableAttribute(2)] T> : IDisposable

Provides thread-local storage of data.
提供线程本地数据存储。

System.Threading.AsyncLocal<[NullableAttribute(2)] T>

Represents ambient data that is local to a given asynchronous control flow, such as an asynchronous method.
表示给定异步控制流本地的环境数据,例如异步方法。

Console Code

ThreadLocal<T>AsyncLocal<T> 的作用和区别如示例代码所示:

using System;
using System.Threading;
using System.Threading.Tasks;

namespace Tutorial.Console
{
    class Program
    {
        // 线程共享变量
        static ThreadLocal<int> threadLocal = new ThreadLocal<int>();

        // 异步共享变量
        static AsyncLocal<int> asyncLocal = new AsyncLocal<int>();

        static void Main(string[] args)
        {
            // 声明一个委托实例
            Action act = async () =>
            {
                await RunAsync();
            };

            // 执行委托
            act();

            System.Console.Read();
        }

        static async Task RunAsync()
        {
            // 给共享变量赋值
            threadLocal.Value = 53000;
            asyncLocal.Value = 53000;

            // 输出当前线程的ID,变量的值
            System.Console.WriteLine($"异步等待前,当前线程ID:{Thread.CurrentThread.ManagedThreadId}," +
                $"{nameof(threadLocal)} = {threadLocal.Value}," +
                $"{nameof(asyncLocal)} = {asyncLocal.Value}");
            
            // 开始执行异步方法,并等待完成
            await Task.Delay(50);

            // 异步等待完成后,再次输出当前线程的ID,变量的值
            System.Console.WriteLine($"异步等待后,当前线程ID:{Thread.CurrentThread.ManagedThreadId}," +
                $"{nameof(threadLocal)} = {threadLocal.Value}," +
                $"{nameof(asyncLocal)} = {asyncLocal.Value}");
        }
    }
}

// 控制台输出:

# 异步等待前,当前线程ID:1,threadLocal = 53000,asyncLocal = 53000
# 异步等待后,当前线程ID:4,threadLocal = 0,asyncLocal = 53000

小结

在多线程环境时,await 前后的代码可能会运行在不同的线程上(切换多线程上下文),这是因为线程是由 System.Threading.Task 来调度的。

【.NET深呼吸】基于异步上下文的本地变量(AsyncLocal) - 东邪独孤 - 博客园

关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9
扫一扫关注公众号添加购物返利助手,领红包
Comments are closed.

推荐使用阿里云服务器

超多优惠券

服务器最低一折,一年不到100!

朕已阅去看看