C#使用CallContext缓存线程数据

yizhihongxing

C#使用CallContext缓存线程数据

CallContext类是一个建议性的机制,可以在跨越异步点的执行上下文中传递状态,CallContext可以以独立于特定线程的方式存储数据。在异步处理程序和其他不同的执行上下文中使用CallContext类存储操作上下文信息(例如用户身份、性能跟踪信息和其他逻辑相关的信息),可以在各种环境中很方便地访问信息。

CallContext 所有有关的数据都是存储在线程上下文中的,所以不会跨越线程传递。一些常见的操作上下文类如 HttpContext、OperationContext 和 CallContext 都使用 CallContext 来跨线程携带信息。

步骤一:使用CallContext类在获得数据后把它缓存到当前线程中

可以使用 CallContext 类将当前线程中的全局或易失数据关联起来。关联数据后,可以在该线程的任何位置访问该数据,并且可以使用不同于堆上缓存 Storage 时要使用的方法列表。

CallContext.LogicalSetData()方法用于将变量放入线程特定的数据槽中。

代码示例:

CallContext.LogicalSetData("UserName", "John");

步骤二:通过CallContext类获取缓存的数据

使用CallContext类获取缓存数据需使用CallContext.LogicalGetData()方法,它会从线程特定的数据槽中获取变量的值。调用方法LogicalSetData()和 LogicalGetData()必须成对出现,否则有可能发生内存泄漏。

代码示例:

string userName = (string) CallContext.LogicalGetData("UserName");

示例一:在Thread中使用CallContext缓存数据

在以下代码示例中,我们在主线程中将“UserName”放置于CallContext中,并创建了一个新的线程。在新线程中,我们获取保存在CallContext中的用户名。

代码示例:

using System.Runtime.Remoting.Messaging;
using System.Threading;
using System;
class Example
{
   static void Main()
   {
      string userName = "Leslie";
      Console.WriteLine("1. Main thread, user = {0}", userName);
      // Save the data and create the thread.
      CallContext.LogicalSetData("UserName", userName);
      Thread newThread = new Thread(ThreadMethod);
      newThread.Start();
      newThread.Join();

      // Retrieve the data.
      string reply = (string) CallContext.LogicalGetData("UserName");
      Console.WriteLine("\n1. Main thread, user = {0}", reply);
   }

   static void ThreadMethod()
   {
      // Retrieve the data
      string userName = (string) CallContext.LogicalGetData("UserName");
      Console.WriteLine("\n2. Second thread, user = {0}", userName);
      // Change the data and store it again.
      CallContext.LogicalSetData("UserName", "Anne");
      userName = (string) CallContext.LogicalGetData("UserName");
      Console.WriteLine("\n3. Second thread, user = {0}", userName);
   }
}

输出结果:

1. Main thread, user = Leslie

2. Second thread, user = Leslie

3. Second thread, user = Anne

1. Main thread, user = Leslie

示例二:使用CallContext类传递身份验证Token

以下示例演示了使用CallContext类在线程间传递身份验证Token的方法。身份验证Token是一种通过API访问外部服务的一种方法,该方法需将请求中的任何与身份验证Token相关的信息与消息一起传输。在以下示例中,身份验证Token是“Token123”并存储在CallContext中,然后使用Task.Run异步执行工作。在异步工作中,从CallContext获取Token并获取授权。

代码示例:

using System;
using System.Runtime.Remoting.Messaging;
using System.Threading;
using System.Threading.Tasks;

class Example
{
    static void Main(string[] args)
    {
        CallContext.LogicalSetData("Token", "Token123");
        Console.WriteLine("Main thread {0} with Identity {1}",
                          Thread.CurrentThread.ManagedThreadId,
                          Thread.CurrentThread.ManagedThreadId);
        Task.Run(() => {Work();} ).Wait();
        Console.WriteLine("Main thread {0} done. Press Enter.",
                          Thread.CurrentThread.ManagedThreadId);
        Console.ReadLine();
    }

    static void Work()
    {
        Console.WriteLine("Work thread {0} with Identity {1}",
                          Thread.CurrentThread.ManagedThreadId,
                          Thread.CurrentThread.ManagedThreadId);
        Console.WriteLine("Authorized with token '{0}'",
                          CallContext.LogicalGetData("Token"));
    }

}

输出结果:

Main thread 1 with Identity 1
Work thread 5 with Identity 5
Authorized with token 'Token123'
Main thread 1 done. Press Enter.

以上就是关于C#使用CallContext缓存线程数据的完整攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#使用CallContext缓存线程数据 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • asp.net 字符串、二进制、编码数组转换函数

    asp.net提供了多个字符串、二进制、编码数组的转换函数,它们可以帮助我们在不同的数据类型之间进行转换。下面是一些常用的转换函数: Convert.ToBase64String Method 该方法可以将给定的二进制数据转换成base64编码的字符串: byte[] data = new byte[] { 0x48, 0x65, 0x6c, 0x6c, 0…

    C# 2023年5月31日
    00
  • 基于SqlSugar的开发框架循序渐进介绍(27)– 基于MongoDB的数据库操作整合

    SqlSugar的开发框架本身主要是基于常规关系型数据库设计的框架,支持多种数据库类型的接入,如SqlServer、MySQL、Oracle、PostgreSQL、SQLite等数据库,非关系型数据库的MongoDB数据库也可以作为扩展整合到开发框架里面,通过基类的继承关系很好的封装了相关的基础操作功能,极大的减少相关处理MongoDB的代码,并提供很好的开…

    C# 2023年4月19日
    00
  • 常用C#关键字详解教程(比较全面)

    常用C#关键字详解教程 C#是一种现代的、对象导向的编程语言,用于.NET平台。在C#中有许多关键字,这些关键字用于定义变量、控制流程、类或结构、枚举等。下面我们将详细讲解C#中常用的关键字。 变量定义相关关键字 var var用于在编译期间推断变量类型。它指示编译器基于初始化表达式计算左侧变量的类型。例如: var str = "hello wo…

    C# 2023年5月15日
    00
  • .Net Core WebApi的简单创建以及使用方法

    创建和使用.NET Core Web API是一种构建RESTful Web服务的常见方法。本文将详细讲解.NET Core Web API的简单创建以及使用方法,包括环境搭建、代码实现、示例说明等。 环境搭建 在开始实现.NET Core Web API之前,我们需要先搭建好开发环境。具体来说,我们需要安装以下软件: Visual Studio 2019或…

    C# 2023年5月16日
    00
  • C#利用反射来判断对象是否包含某个属性的实现方法

    可以通过反射来动态获取和设置对象的属性值。在C#中,可以使用反射判断某个对象是否包含某个特定属性。下面是使用反射来判断对象是否包含某个属性的实现方法: 1.获取类型对象 使用反射,首先需要获取代表要分析的类型的Type对象。可以通过以下两种方法实现: 使用类型名字符串: Type type = Type.GetType(“命名空间.类名”); 直接通过类类型…

    C# 2023年6月1日
    00
  • python 如何实现跳过异常继续执行

    要实现跳过异常继续执行,可以使用 Python 中的 try-except 语句。try 块中包含可能出现异常的代码,except 块则定义了在出现异常时的响应。如果出现异常,程序会跳转到 except 块继续执行。下面是一个简单的示例: try: # 可能出现异常的代码 except: # 出现异常时执行的代码 如果上面的代码中 try 块中的代码出现了异…

    C# 2023年5月15日
    00
  • c#制作屏幕保护程序步骤(字幕屏保)

    以下是制作 C# 字幕屏保程序的完整攻略: 步骤1:创建新项目 首先,打开 Visual Studio 并创建一个新项目。在新项目对话框中,选择 “Windows Forms 应用程序”,然后在项目名称和位置部分命名并选择项目位置。 步骤2:窗口调整 在创建窗口后,需要对窗口进行一些调整以确保它适合作为屏幕保护程序。在窗口设计器中选择窗口控制,右键单击然后选…

    C# 2023年6月7日
    00
  • ASP.NET Core MVC 从入门到精通之HttpContext

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启…

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