iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >浅析C#中的AsnycLocal与ThreadLocal
  • 603
分享到

浅析C#中的AsnycLocal与ThreadLocal

2024-04-02 19:04:59 603人浏览 安东尼
摘要

AsnyncLocal与ThreadLocal都是存储线程上下文的变量,但是,在实际使用过程中两者又有区别主要的表现在: AsyncLocal变量可以在父子线程中传递,创建

AsnyncLocal与ThreadLocal都是存储线程上下文的变量,但是,在实际使用过程中两者又有区别主要的表现在:

  • AsyncLocal变量可以在父子线程中传递,创建子线程时父线程会将自己的AsyncLocal类型的上下文变量赋值到子线程中,但是,当子线程改变线程上下文中AsnycLocal变量值后,父线程不会同步改变。也就是说AsnycLocal变量只会影响他的子线程,不会影响他的父级线程。
  • TreadLocal只是当前线程的上下文变量,不能在父子线程间同步。

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

从结果上可以看出一下结论:

  • RunAsync执行前ThreadLocal值被切成0即ThreadLocal变量在新线程里面没有继承主线程的上下文变量,但是AsyncLocal继承了。
  • Delay返回后,线程id变了,同时,TheadLocal中的变量为0。
  • RunAsync结束后AyncLocal又切回主线程的上下文值,,同样Threadlocal中的值丢失。
  • 由于await执行完返回之后,.net会在线程池中随机选取一个线程来执行await之后的逻辑,所以,await之后同时也会有一定几率获取到之前的线程,如果出现这种情形,TreadLocal会获取到之前的上下文,此时会出现意料之外的问题,从现象上看报错可能会是一个概率性问题。

总结

到此这篇关于C#中AsnycLocal与ThreadLocal的文章就介绍到这了,更多相关C#的AsnycLocal与ThreadLocal内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 浅析C#中的AsnycLocal与ThreadLocal

本文链接: https://www.lsjlt.com/news/137267.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅析C#中的AsnycLocal与ThreadLocal
    AsnyncLocal与ThreadLocal都是存储线程上下文的变量,但是,在实际使用过程中两者又有区别主要的表现在: AsyncLocal变量可以在父子线程中传递,创建...
    99+
    2024-04-02
  • 浅析C语言中的setjmp与longjmp函数
    setjmp和longjmp是C语言独有的,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,按照程序员的预先设计的意图,去实现对程序中可能出现的异常进行集中处理。 先来看一...
    99+
    2022-11-15
    setjmp longjmp
  • 浅析C/C++中的可变参数与默认参数
    千万要注意,C不支持默认参数 C/C++支持可变参数个数的函数定义,这一点与C/C++语言函数参数调用时入栈顺序有关,首先引用其他网友的一段文字,来描述函数调用,及参数入栈: ---...
    99+
    2022-11-15
    可变参数 默认参数
  • Spring中ThreadLocal的解析
    目录1.ThreadLocal的接口方法2.TheadLocal实例3.Thread同步机制的比较(总结)4.Spring使用ThreadLocal解决线程安全问题  &n...
    99+
    2024-04-02
  • C++浅析类与对象的基础
    目录面向过程和面向对象类的引入访问限定符封装类的作用域类的实例化面向过程和面向对象 类和对象是 C++ 的核心特性 我们之前的C语言就属于面向过程,关注过程,分析求解问题的步骤再通过...
    99+
    2024-04-02
  • 深入浅析C语言与C++的区别与联系
    目录一、C语言是面向过程语言,而C++是面向对象语言1、面向过程和面向对象的区别2、面向过程和面向对象的优缺点面向过程语言面向对象语言二、具体语言上的区别1、关键字的不同2、后缀名不...
    99+
    2024-04-02
  • C++浅析引用的定义与使用
    目录解释引用引用的作用关于局部变量的引用解释引用 首先我们先来看一个引用的例子 int main() { int a = 10; int& Bin = a; cout ...
    99+
    2024-04-02
  • 浅析php中==与===的区别
    在PHP中,有时候我们需要比较两个变量是否相等。为了实现这个功能,我们可以使用等于操作符“==”或者全等操作符“===”。虽然两个操作符都可以完成相等比较,但是它们之间还是存在一些差别。在本文中,我们将分别介绍“==”和“===”的具体作用...
    99+
    2023-05-14
    === == php
  • 如何浅析C++中的C++堆栈
    这篇文章给大家介绍如何浅析C++中的C++堆栈,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。想要学好C++的C++堆栈,那么就要了解什么是C++堆栈,所为C++堆栈就是一种数据项按序排列的数据结构,只能在一端(称为栈顶...
    99+
    2023-06-17
  • 怎么浅析C++中的C++关键字
    怎么浅析C++中的C++关键字,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在C++语言中,然后就总结了许多C++关键字,如果不使用常引用、指针,则须用const_cast&l...
    99+
    2023-06-17
  • C++中的策略模式浅析
    策略模式主要解决在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护,其实际就是用来抽象变化的(和开放-封闭原则是一个原理),只要在分析过程中我们发现...
    99+
    2023-02-27
    C++策略模式 C++设计模式 C++ 设计模式 策略模式
  • 浅析C++浅拷贝与深拷贝的联系和区别
    文章简述 c++中构造函数分为三类:无参构造、带参构造和拷贝构造,其中拷贝构造可分为默认拷贝(浅拷贝)、深拷贝,在程序中,这里我们主要讲浅拷贝和深拷贝的联系和区别。 首先,我们要明白...
    99+
    2024-04-02
  • WMTS中TileMatrix与ScaleDenominator浅析
    目录正文1. WMTS 中的 TileMatrix 是什么2. ScaleDenominator 是什么2.1. 一个像素的显示器物理尺寸是多大2.2. 瓦片图片的一个像素是多大2....
    99+
    2023-03-06
    WMTS TileMatrix ScaleDenominator WMTS TileMatrix
  • C++浅析类与对象基础点
    目录认识类和对象访问限定符this指针认识类和对象 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C++是基于面向对象的,关注的是对象,将一件事...
    99+
    2024-04-02
  • 浅析C++中类模板的用法
    目录C++类模板总结C++类模板 C++类模板是一种用于创建通用类的工具,它允许我们定义一个通用类,支持多种类型。 定义类模板 C++中定义类模板的语法如下: template<...
    99+
    2023-05-16
    C++类模板用法 C++类模板使用 C++类模板
  • 浅析C语言中assert的用法
    assert是C语言中的一个宏,用于在程序中检查特定的条件是否为真。当assert条件为假时,程序会中止执行,并打印出错误消息。as...
    99+
    2023-08-11
    C语言
  • 浅析C++中的间接宏函数
    宏函数对于每个C++程序员都决不陌生,就算是初出茅庐的C++程序员也知道如何定义、使用宏函数。 但是当初学者看到类似于以下这种宏函数嵌套的时候,可能还是会比较嘀咕, #defi...
    99+
    2024-04-02
  • 浅析C++中static的一些用法
    概述 Static,顾名思义是静态、静止的意思。在C语言中static是一个用来修饰变量与函数的关键字,被修饰对象的某些性质将发生根本性的改变,而这些变化从某种意义上又似乎契合了&l...
    99+
    2022-12-08
    static的用法 c++ static关键字
  • 浅谈C++中const与constexpr的区别
    目录一.const常量与#define比较二.const修饰1.修饰普通变量,必须初始化2.修饰类变量和成员变量3.修饰成员函数4.修饰指针5.修饰引用三.const转换四.顶层co...
    99+
    2024-04-02
  • 怎么浅析SQLServer中的Scanf与Printf
    怎么浅析SQLServer中的Scanf与Printf,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。SQLServer中有两个扩展存储过程实现...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作