浅析C#中的AsnycLocal与ThreadLocal

浅析C#中的AsyncLocal与ThreadLocal

在C#中,当多个线程同时访问同一个变量时,需要使用线程安全的方式保护变量,避免数据竞争。AsyncLocal和ThreadLocal就是两种常用的线程安全技术。

引言

AsyncLocal

AsyncLocal是.NET Framework 4.6中引入的一种用于在异步代码中存储和检索数据的新机制。它类似于ThreadLocal,但与线程模型无关。

ThreadLocal

ThreadLocal是.NET Framework中的一个非常有用的类。它可以将数据存储在线程的本地存储区中,以便多个线程可以独立地使用相同的数据结构,而不会导致冲突或竞争条件。

AsyncLocal vs ThreadLocal

  1. AsyncLocal可以跨异步上下文流动,而ThreadLocal只能在同一个线程中起作用。
  2. AsyncLocal在异步操作之间共享数据,而ThreadLocal针对每个线程存储单独的数据。

由于AsyncLocal的功能更加强大,所以它更适合在异步代码中使用。

示例

下面给出两个示例来说明AsyncLocal的用法。

示例1:在异步请求中获取TraceID

public class TraceIdMiddleware
{
    private readonly RequestDelegate _next;
    private static readonly AsyncLocal<string> TraceId = new AsyncLocal<string>();

    public TraceIdMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        TraceId.Value = Guid.NewGuid().ToString();
        context.Response.OnStarting(() =>
        {
            context.Response.Headers.Add("X-Trace-Id", new string[] { TraceId.Value });
            return Task.CompletedTask;
        });
        await _next(context);
    }
}

上述代码中,我们使用AsyncLocal存储了TraceID,利用TraceID可以跨异步方法调用。

示例2:在异步请求中获取当前用户身份

public static class CurrentUser
{
    private static readonly AsyncLocal<AppUser> _currentUser = new AsyncLocal<AppUser>();

    public static AppUser Current
    {
        get => _currentUser.Value;
        set => _currentUser.Value = value;
    }
}

public class UserController : ControllerBase
{
    [HttpGet("current")]
    public ActionResult GetCurrentUser()
    {
        return Ok(CurrentUser.Current);
    }

    [HttpGet("set")]
    public ActionResult SetCurrentUser()
    {
        var currentUser = new AppUser
        {
            Id = 1,
            Name = "张三"
        };

        CurrentUser.Current = currentUser;

        return Ok();
    }
}

上述代码中,我们使用AsyncLocal存储用户身份。在请求开始时,我们将当前用户存储到AsyncLocal中。在后续的操作中,我们可以通过静态属性获取当前用户,而不用担心多线程并发访问的问题。

总结

AsyncLocal是.NET Framework 4.6中引入的一种用于在异步代码中存储和检索数据的新机制。与之相比,ThreadLocal只能在同一个线程中起作用。在异步场景中,使用AsyncLocal可以更加方便地存储和获取数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析C#中的AsnycLocal与ThreadLocal - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 手把手带你定制.NET 6.0的Middleware中间件

    以下是关于“手把手带你定制.NET6.0的Middleware中间件”的完整攻略: 1. 什是Middleware中间件? Middleware中间件是ASP.NET Core用程序中的一种组件,它可以处理HTTP请求和响应。Middleware中间件可以在请求到达控制之前或响应返回客户之前执行一些操作,例如身份验证、日志记录、缓存等。 2. 创建Middl…

    C# 2023年5月12日
    00
  • C# 字节数组、各进制字符串数据互转

    前言 日常开发过程中,格式转换是必不可少的重要环节,经常是十进制转十六进制、十六进制转byte数组又转换回来来回转换,最然进制转换很基础同时 C# 也提供了很多直接方便进行格式转换的方法,但是封装一个工具类会方便很多,不用每次都手写代码逻辑,之前一直都是简单的自己写,稍复杂的就用前辈写好的直接调用,这次自己写一个。 简单的定义为一行代码完事,多一行都不写?。…

    C# 2023年5月5日
    00
  • ASP.NET Core在WebApi项目中使用Cookie

    ASP.NET Core在WebApi项目中使用Cookie攻略 本攻略将介绍如何在ASP.NET Core WebApi项目中使用Cookie。Cookie是一种在Web应用程序中存储数据的机制,可以用于在客户端和服务器之间传递数据。本攻略将提供详细的步骤和示例说明,以帮助您快速入门ASP.NET Core中的Cookie使用。 步骤 步骤1:创建一个新的…

    C# 2023年5月17日
    00
  • .NET中字符串比较的最佳用法

    关于“.NET中字符串比较的最佳用法”的攻略我可以给出以下内容: 1. 字符串比较的基本知识 1.1 区分大小写、不区分大小写 .NET中字符串比较默认是区分大小写的,例如 “cat” 和 “Cat” 是不相等的。但是如果要进行不区分大小写的比较,可以使用 StringComparison 枚举来指定不区分大小写的比较方式。 示例代码: string s1 …

    C# 2023年6月8日
    00
  • CPU占用率高的N种原因

    首先我们来详细讲解下“CPU占用率高的N种原因”的完整攻略。 简介 CPU占用率高通常意味着系统资源的占用比较高,导致系统出现卡顿、卡死、运行缓慢等问题。对于软件开发与运维工程师来说,了解高CPU占用率的原因,是进行系统性能调优的基础。 N种原因 下面我们列举了高CPU占用率的N种原因,其中包括: 程序死循环 进程/线程阻塞 垃圾回收 高负载 CPU过热 接…

    C# 2023年6月7日
    00
  • C#利用ASP.NET Core开发学生管理系统详解

    这里是C#利用ASP.NET Core开发学生管理系统的完整攻略。 步骤一:创建.NET Core Web应用程序 打开Visual Studio,并以管理员身份运行。 在Visual Studio中选择“文件”>“新建”>“项目”。 选择”.NET Core”类别,然后选择“ASP.NET Core Web应用程序”模板(或“ASP.NET C…

    C# 2023年6月3日
    00
  • Python调用C# Com dll组件实战教程

    下面我会详细讲解“Python调用C#Comdll组件实战教程”的完整攻略。 什么是C#Comdll组件 C#Comdll组件是一个被编译成COM组件的C#库,通过COM技术可以将这个库的方法暴露出来并提供给其他编程语言使用。 Python调用C#Comdll组件的基本流程 导入Python的win32com模块和C#Comdll组件。 使用win32com…

    C# 2023年5月15日
    00
  • jquery对象访问是什么及使用方法介绍

    jQuery对象是指通过jQuery选择器选择到的DOM元素,它是一个包含了一系列jQuery方法的对象。本文将详细介绍jQuery对象的访问和使用方法,包括获取和操作jQuery对象等。 获取jQuery对象 获取jQuery对象的方法有多种,以下是常用的几种方法: 通过选择器获取 我们可以使用jQuery选择器来获取jQuery对象,例如: var $d…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部