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# 读写自定义的Config文件的实现方法

    下面是详细讲解“C# 读写自定义的Config文件的实现方法”的完整攻略: 什么是自定义的Config文件 Config文件是指程序的配置文件,用于存储一些程序的配置信息,C#中的Config文件一般都是XML格式的。自定义的Config文件也就是指根据自己的需求,定义一个新的配置文件,并在程序中进行读写操作。 自定义Config文件的实现方法 实现自定义的…

    C# 2023年6月1日
    00
  • 网站被攻击了!!!

    重要声明-针对攻击者 网站pljzy.top被某人攻击 ZY知识库 首先 说我网站抄袭,文章抄袭,ok,你列举一下我有那几篇文章是抄的别人的?自己眼睛不看的是吧,但凡我参考的别人的文章我都会放原文地址。 先放几张图片,真搞不懂我抄谁了,下面全是我自己电脑的md文件,我抄谁的了?全是我自己做的笔记。 其次说我网站抄袭,原作者都没说话,轮到你说了吗?这个博客本来…

    C# 2023年5月7日
    00
  • C# 实现连连看功能(推荐)

    C# 实现连连看功能(推荐) 引言 连连看是一种受欢迎的游戏,早期多出现在各种小游戏网站和手机应用中。连连看的功能算法也较为复杂,本文将使用C#编程语言来实现连连看功能,供各位开发者参考。 分析 连连看的主要逻辑是,选择两个相同的图片,并且图片之间的连接线条不超过三条,即可消除这两个图片。为了实现这个功能,需要按照以下步骤来进行操作: 搭建界面 加载图片资源…

    C# 2023年6月6日
    00
  • asp.net core webapi项目配置全局路由的方法示例

    在ASP.NET Core Web API项目中,可以使用全局路由来配置应用程序的路由。本攻略将深入探讨ASP.NET Core Web API项目配置全局路由的方法,并提供两个示例说明。 配置全局路由 要配置全局路由,我们需要在Startup.cs文件中使用MapRoute方法。以下是一个示例: public void Configure(IApplica…

    C# 2023年5月17日
    00
  • ThreadLocal 在上下文传值场景实践源码

    ThreadLocal 是 Java 中常用的多线程编程技术之一,它可以在多个线程环境中保存并传递数据,将数据与线程绑定在一起,实现线程的局部变量。在一些上下文传值的场景中,ThreadLocal 可以较为方便的实现参数的传递。接下来,本文将详细讲解 ThreadLocal 在上下文传值场景实践源码的完整攻略。 什么是 ThreadLocal ThreadL…

    C# 2023年6月7日
    00
  • c# 使用异步编程的方法

    C#使用异步编程的方法 在C#中,使用异步编程可以让应用程序更加高效、协调、并发和可伸缩。本文将提供使用异步编程的完整攻略。 什么是异步编程? 异步编程是指在程序执行某个任务时,可以继续执行其他任务,而不需要等待该任务完成。异步编程可以让应用程序更加高效、协调、并发和可伸缩。 在C#中,异步编程的主要特点是使用任务(Task)和异步方法(Async/Awai…

    C# 2023年5月31日
    00
  • C# StackExchange.Redis 用法汇总

    C# StackExchange.Redis 用法汇总 StackExchange.Redis 是 StackExchange(Stack Overflow 所属公司)开发的一款 Redis 客户端库。它是基于 .NET Standard 的,所以可以在各种平台上使用。StackExchange.Redis 有着良好的性能和低延迟,被广泛使用。本文将详细介绍…

    C# 2023年6月3日
    00
  • C# Winform实现自定义漂亮的通知效果

    下面是C# Winform实现自定义漂亮的通知效果的完整攻略。 目录 前言 准备工作 实现步骤 示例说明一 示例说明二 总结 前言 在Winform应用程序中,通知窗口往往是用MessageBox来实现的。但是MessageBox的样式过于单一,且不支持自定义,使用不够灵活。本文将介绍如何使用C#的Winform技术实现自定义漂亮的通知效果。 准备工作 Vi…

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