C#使用CallContext缓存线程数据

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日

相关文章

  • C#中dotnetcharting的用法实例详解

    C#中dotnetcharting的用法实例详解 简介 DotNetCharting 是基于 .NET 平台的一个强大的图表绘制组件。它可以帮助开发人员快速地在自己的 Web 应用程序中添加各种类型的图表,如 2D 和 3D 图表、仪表盘、实时图表和地图。DotNetCharting 对于那些需要快速建立强大图表的开发人员来说,是一个非常有用的工具。 安装 …

    C# 2023年6月1日
    00
  • C#实现左截取和右截取字符串实例

    C#是一种强类型的面向对象编程语言,同时也支持字符串操作。在C#中,我们可以使用Substring方法来实现左截取和右截取字符串。 具体的实现方法如下: 左截取字符串 我们可以使用Substring方法实现左截取字符串,方法的参数时从左边开始截取的字符个数。 下面是一个示例代码: string str = "hello, world"; …

    C# 2023年6月8日
    00
  • C#的this关键字的2种用法

    C#中的this关键字有两种主要的用法,分别是限定当前对象和作为参数传递。下面将详细讲解这两种用法。 限定当前对象 在C#中,每个实例对象都有一个对于所在的类的引用。在实例方法中,可以使用this关键字来引用当前对象。这种用法主要有以下两个作用: 区分实例变量和局部变量 在方法链式调用中提高代码可读性 区分实例变量和局部变量 当实例变量和局部变量同名时,为了…

    C# 2023年5月15日
    00
  • 在C#中使用Channels的完整教程

    在C#中使用Channels的完整教程 什么是Channel? Channel是在C# 7.0版本中引入的一种全新的内置类型,用于在多个awaitable操作之间更方便地进行同步和异步消息传递。 Channel可以看做是一个类似线程安全队列的数据结构,支持读/取操作(receive)和写/存操作(send),并且本身天生具有异步支持(async/await)…

    C# 2023年6月3日
    00
  • C#两个相同属性的类赋值方法

    为了理解C#两个相同属性的类赋值方法,我们需要首先了解两个重要的概念:类和类的属性。类是对象的模板或蓝图,它定义了对象的状态和行为;而属性是类的成员之一,用来描述对象的特征或状态。在C#中,我们可以通过类的赋值来将一个对象的属性的值赋给另一个对象。 接下来,我们将讨论C#两个相同属性的类赋值方法的完整攻略,过程中将包含两条示例说明: 一、初步了解类和类的属性…

    C# 2023年5月31日
    00
  • C# 如何合并和拆分PDF文件

    针对这个问题,我可以给你提供以下完整攻略: 前置要求 在进行C#合并和拆分PDF文件之前,我们需要先安装iTextSharp这个C# PDF处理库。你可以使用NuGet下载并安装iTextSharp,或者直接在Visual Studio中通过“引用”菜单添加对应的dll文件。 合并PDF文件 如果需要合并多个PDF文件,可以采取如下步骤进行处理: 第一步:新…

    C# 2023年6月6日
    00
  • ASP.NET Core获取正确查询字符串参数示例

    标题:ASP.NET Core获取正确查询字符串参数示例 前言: 在Web应用程序中,查询字符串是一种常用的传递参数的方式。然而在ASP.NET Core中,获取查询字符串时需要特别注意一些情况,否则就可能出现获取不到参数值或者获取到错误参数值的问题。本文将详细讲解ASP.NET Core获取正确查询字符串参数的示例。 一、在Controller中获取查询字…

    C# 2023年6月3日
    00
  • C#获取本机IP地址(ipv4)

    获取本机IP地址是在编程过程中常用的功能之一,本文将详细讲解如何使用C#获取本机IP地址(ipv4)。 获取本机IP地址的代码 下面是获取本机IP地址的C#代码: using System.Net; using System.Net.Sockets; IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostN…

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