使用ThreadStatic属性提供线程安全的数据访问

devtools/2024/11/13 5:34:56/

ThreadStatic是一个C#属性,用于为每个线程提供独立的静态字段。使用它可以让每个线程拥有该字段的独立副本,避免线程之间的共享

用途

  • 线程独立数据:每个线程有独立的数据副本,彼此不干扰
  • 性能优化:在多线程环境中减少锁的使用,因为每个线程访问自己的数据
  • 线程安全:自动提供线程安全的数据访问

举例

using System;
using System.Threading.Tasks;class Program
{[ThreadStatic]private static int _threadSpecificData;static async Task Main(){var task1 = Task.Run(() =>{_threadSpecificData = 42;Console.WriteLine($"Task 1: {_threadSpecificData}");});var task2 = Task.Run(() =>{_threadSpecificData = 84;Console.WriteLine($"Task 2: {_threadSpecificData}");});await Task.WhenAll(task1, task2);}
}

运行结果:

Task 1: 42
Task 2: 84

实际项目应用

以下是Dynamo项目TraceUtils类

using System;
using System.Threading.Tasks;
/// <summary>
/// Utility class to Get/Set TraceData
/// </summary>
public static class TraceUtils
{internal const string __TEMP_REVIT_TRACE_ID = "{0459D869-0C72-447F-96D8-08A7FB92214B}-REVIT";// ReSharper restore InconsistentNaming[ThreadStatic] private static Dictionary<string, string> _localStorageSlot;internal static Dictionary<string, string> LocalStorageSlot{get{return _localStorageSlot ?? (_localStorageSlot = new Dictionary<string, string>());}set{_localStorageSlot = value;}}/// <summary>/// Returns a list of the keys bound to trace elements/// This should be extracted from the attribute on the methods/// </summary>/// <returns></returns>internal static List<String> TEMP_GetTraceKeys(){//TODO:Luke Extract this from RequiresTraceAttributereturn new List<string>() { __TEMP_REVIT_TRACE_ID };}/// <summary>/// Clear a specific key/// </summary>/// <param name="key"></param>internal static void ClearTLSKey(string key){LocalStorageSlot.Remove(key);}/// <summary>/// Clear the named slots for all the know keys/// </summary>internal static void ClearAllKnownTLSKeys(){LocalStorageSlot.Clear();}/// <summary>/// Returns the data that is bound to a particular key/// </summary>/// <param name="key"></param>/// <returns></returns>public static string GetTraceData(string key){string data;if (!LocalStorageSlot.TryGetValue(key, out data)){return null;}else{return data;}}/// <summary>/// Set the data bound to a particular key/// </summary>/// <param name="key"></param>/// <param name="value"></param>public static void SetTraceData(string key, string value){if (LocalStorageSlot.ContainsKey(key)){LocalStorageSlot[key] = value;}else{LocalStorageSlot.Add(key, value);}}
}
class Program
{static async Task Main(string[] args){var task1 = Task.Run(() =>{TraceUtils.SetTraceData("Task1Key", "Task1Data");Console.WriteLine($"Task 1: {TraceUtils.GetTraceData("Task1Key")}");});var task2 = Task.Run(() =>{TraceUtils.SetTraceData("Task2Key", "Task2Data");Console.WriteLine($"Task 2: {TraceUtils.GetTraceData("Task2Key")}");});await Task.WhenAll(task1, task2);}
}

运行结果:

Task 1: Task1Data
Task 2: Task2Data

参考

  • https://github.com/DynamoDS/Dynamo.git

http://www.ppmy.cn/devtools/92668.html

相关文章

银行卡OCR识别接口如何用Java进行调用

一、什么是银行卡OCR识别接口&#xff1f; 银行卡OCR识别接口&#xff0c;它可以实时对银行卡卡面的文字信息进行识别&#xff0c;包括银行卡号、银行名称、卡类型、有效期等要素&#xff0c;从而提高信息录入效率&#xff0c;改善用户体验。 二、银行卡OCR识别接口适用场景有…

git做版本管理的时候,中途添加了新的内容在.gitignore中,怎么让git不再跟踪

当您在 .gitignore 文件中添加了新的路径模式后&#xff0c;Git 将不再跟踪这些路径下的新文件。但是&#xff0c;如果这些路径下的文件已经被 Git 跟踪&#xff08;即它们已经被提交到仓库&#xff09;&#xff0c;您需要执行一些额外的步骤来让 Git 停止跟踪这些文件。 以下…

【MySQL数据库】单机、集群、分布式的区别

单机、集群和分布式是计算机系统中三种不同的架构模型,它们在资源管理、任务执行和性能优化方面有显著区别。 图片来源 1. 单机(Standalone) 单机指的是单一计算机系统,即所有的计算任务和数据都在一台计算机上处理。单机系统的特点包括: 硬件限制:受限于单台机器的计…

以树莓集团的视角:探索AI技术如何重塑数字媒体产业发展

在科技日新月异的今天&#xff0c;AI技术如同一股不可阻挡的潮流&#xff0c;正深刻改变着我们的世界&#xff0c;尤其是数字媒体产业发展。作为数字产业生态链的杰出建设者&#xff0c;树莓集团始终站在时代前沿&#xff0c;积极探索AI技术如何为数字媒体产业注入新活力。 在树…

【CSS】可替换元素的控制属性:object-fit属性和object-position属性

一、可替换元素是什么&#xff1f; 可替换元素指的是其展现的效果和内容是不受到css控制的&#xff0c;而是由外部资源来决定的。 典型的可替换元素有<iframe>、<img>、<video>、<embed>&#xff0c;有些情况下canvas、audio、object、option、以及ty…

H5 优化手段

容器预建 提前创建 Webview 容器 创建时机&#xff1a;闲时创建。Webview 只能在主线程创建&#xff0c;但又不能阻碍主流程&#xff0c;因此需要在 IdleHandler 时机处理。与前端的 requestIdleCallback 、React Scheduler 概念相似。创建个数&#xff1a;一般仅创建一个&…

黑盒测试定义:优势、类型和工具

了解黑盒测试的本质&#xff0c;无需深入了解代码内部即可测试功能。 在不了解软件代码结构或实现细节的情况下进行系统测试是软件测试生命周期的重要组成部分。与需要深入了解内部结构和逻辑的白盒测试不同&#xff0c;黑盒测试允许工程师在不了解软件内部工作原理的情况下评估…

uni-app 安卓禁用侧滑返回/虚拟返回(vue3 hook)

[TOC](uni-app 安卓禁用侧滑返回/虚拟返回(vue3 hook)) hook import { onBackPress } from "dcloudio/uni-app"export default function useDisableSwipeBack() {onBackPress((options) > {// 点击虚拟键或者侧滑的时候触发&#xff08;不允许返回&#xff09;i…