文章:ThreadStatic特性

地址:https://www.cnblogs.com/xuejietong/p/10997385.html

带有threadStaticAttribute标记的静态字段在线程之间不共享。每个执行线程都有一个单独的字段实例,并独立地设置和获取该字段的值。

如果在不同的线程上访问该字段,则它将包含不同的值。除了将threadStaticAttribute属性应用于字段之外,还必须将其定义为静态字段(在C中)或共享字段(在Visual Basic中)。不要为标记为threadStaticAttribute的字段指定初始值,因为此类初始化仅在类构造函数执行时发生一次(静态构造函数),因此只影响一个线程。

研究农业银行的支付接口demo时,发现代码中使用了这个特性:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text; namespace com.abc.trustpay.client
{
public class JSON
{
[ThreadStatic]
private static string iJsonString = ""; public static void setJsonString(string aJsonString)
{
JSON.iJsonString = aJsonString.Trim();
} public static string WriteDictionary(IDictionary dic)
{
StringBuilder stringBuilder = new StringBuilder("");
bool flag = false;
stringBuilder.Append("{");
foreach (DictionaryEntry dictionaryEntry in dic)
{
if (flag)
{
stringBuilder.Append(",");
}
stringBuilder.Append("\"");
stringBuilder.Append(dictionaryEntry.Key);
stringBuilder.Append("\":");
stringBuilder.Append("\"");
stringBuilder.Append(dictionaryEntry.Value);
stringBuilder.Append("\"");
flag = true;
}
return stringBuilder.ToString();
} public static string WriteDictionarys(IDictionary dic)
{
StringBuilder stringBuilder = new StringBuilder("");
bool flag = false;
stringBuilder.Append("[");
foreach (int num in dic.Keys)
{
if (flag)
{
stringBuilder.Append("},");
}
string value = JSON.WriteDictionary((IDictionary)dic[num]);
stringBuilder.Append(value);
flag = true;
}
stringBuilder.Append("}]");
return stringBuilder.ToString();
} public static string GetKeyValue(string aTag)
{
string text = JSON.iJsonString;
int num = text.IndexOf(aTag);
string result;
if (num == -1)
{
result = "";
}
else
{
while (!text.Substring(num - 1, 1).Equals("\"") || !text.Substring(num + aTag.Length, 1).Equals("\""))
{
num = text.IndexOf(aTag, num + 1);
if (num == -1)
{
result = "";
return result;
}
}
int length = aTag.Length;
num = num + length + 2;
string text2 = "";
char c = text[num];
if (c == '{')
{
text2 = JSON.GetObjectValue(num, aTag, text);
}
if (c == '"')
{
text2 = JSON.GetStringValue(num, aTag, text);
}
result = text2;
}
return result;
} private static string GetObjectValue(int index, string aTag, string json)
{
int num = 0;
StringBuilder stringBuilder = new StringBuilder();
char c;
while (true)
{
c = json[index];
if (c == '{')
{
num++;
}
if (c == '}')
{
num--;
}
if (num == 0)
{
break;
}
stringBuilder.Append(c);
index++;
}
stringBuilder.Append(c);
return stringBuilder.ToString();
} private static string GetStringValue(int index, string aTag, string json)
{
StringBuilder stringBuilder = new StringBuilder();
index++;
while (true)
{
char c = json[index++];
if (c == '"')
{
break;
}
stringBuilder.Append(c);
}
return stringBuilder.ToString();
} public static Dictionary<int, Hashtable> GetArrayValue(string aTag)
{
string text = JSON.iJsonString;
Dictionary<int, Hashtable> dictionary = new Dictionary<int, Hashtable>();
Hashtable hashtable = new Hashtable();
StringBuilder stringBuilder = new StringBuilder();
int num = text.IndexOf(aTag);
Dictionary<int, Hashtable> result;
if (num == -1)
{
result = dictionary;
}
else
{
int length = aTag.Length;
num = num + length + 2;
int num2 = 0;
while (true)
{
char c = text[num++];
if (c != '[')
{
if (c != ']')
{
stringBuilder.Append(c);
}
if (c == '}')
{
c = text[num++];
hashtable.Add(num2, stringBuilder);
num2++;
stringBuilder = new StringBuilder();
}
if (c == ']')
{
break;
}
}
}
if (hashtable.Count == 0)
{
result = dictionary;
}
else
{
dictionary = JSON.ParseArray(hashtable);
result = dictionary;
}
}
return result;
} public static Dictionary<int, Hashtable> ParseArray(Hashtable hts)
{
Dictionary<int, Hashtable> dictionary = new Dictionary<int, Hashtable>();
Hashtable value = new Hashtable();
foreach (int num in hts.Keys)
{
string json = hts[num].ToString();
value = JSON.ParseString(json);
dictionary.Add(num, value);
value = new Hashtable();
}
return dictionary;
} public static Hashtable ParseString(string json)
{
StringBuilder stringBuilder = new StringBuilder();
Hashtable hashtable = new Hashtable();
int num = json.IndexOf("{");
int length = json.Length;
json = json.Substring(num + 1, length - 2);
json = json.Replace("\"", "");
string[] array = json.Split(new char[]
{
','
});
string[] array2 = new string[2];
for (int i = 0; i < array.Length; i++)
{
array2 = array[i].Split(new char[]
{
':'
});
hashtable.Add(array2[0], array2[1]);
}
return hashtable;
}
}
}

ThreadStatic特性的更多相关文章

  1. AsyncLocal 与 ThreadLocal ThreadStatic特性简介

    AsyncLocal 与 ThreadLocal [.NET深呼吸]基于异步上下文的本地变量(AsyncLocal) https://www.cnblogs.com/tcjiaan/p/5007737 ...

  2. ThreadStatic应用(Identity补完)

    关于Identity Identity自增序列/唯一断标识 起初做这个东西,是在一个内部组件中,用于在高并发的环境下得到一个较短的“相对”不重复标识字符串;(这里说的相对是指一定的数量下不重复) 灵感 ...

  3. 基础才是重中之重~关于ThreadStatic和Quartz的一点渊源

    回到目录 ThreadStatic ThreadStatic是C#里的一个特性,它可以让你的字段在一个线程里有效,但你不能控制这个字段在何时被回收,即如果声明一个int32的字段为ThreadStat ...

  4. 被 C# 的 ThreadStatic 标记的静态变量,都存放在哪里了?

    一:背景 1. 讲故事 前几天公号里有一位朋友留言说,你windbg玩的溜,能帮我分析下被 ThreadStatic 修饰的变量到底存放在哪里吗?能不能帮我挖出来,其实这个问题问的挺深的,玩高级语言的 ...

  5. 【C# 线程】线程局部存储(TLS)理论部分 ThreadStatic|LocalDataStoreSlot|ThreadLocal<T>

    线程本地存储(TLS:Thread Local Storage) 线程本地存储(Thread Local Storage),字面意思就是专属某个线程的存储空间.变量大体上分为全局变量和局部变量,一个进 ...

  6. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  7. [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中)

    [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中) 本节要点: 上节介绍了多线程的基本使用方法和基本应用示例,本节深入介绍.NET ...

  8. .Net面試題

    初级.NET开发人员 - 任何使用.NET的人都应知道的 1. 描述线程与进程的区别? 进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在.进程可以定义程序的 ...

  9. 多线程中Local Store Slot(本地存储槽)

    在Java中有一种ThreadLocal机制,为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突.从线程的角度看,就好像每一个线程都完全 ...

随机推荐

  1. Python - Django - 序列化

    app01/__int__.py: import pymysql pymysql.install_as_MySQLdb() app01/models.py: from django.db import ...

  2. [LeetCode] 676. Implement Magic Dictionary 实现神奇字典

    Implement a magic directory with buildDict, and search methods. For the method buildDict, you'll be ...

  3. [计算机视觉][神经网络与深度学习]Faster R-CNN配置及其训练教程2

    faster-rcnn分为matlab版本和python版本,首先记录弄python版本的环境搭建过程.matlab版本见另一篇:faster-rcnn(testing): ubuntu14.04+c ...

  4. Saltstack限制某些shell命令执行

    在cmdmod模块中cmd.run.cmd.run_all.cmd.run_stdout等都可以执行shell命令,要静止某些shell命令,可以修改_run()这个函数来彻底的静止调用这个命令. c ...

  5. 六、spring之通过FactoryBean为ioc容器中添加组件

    前面我们已经介绍了几种为容器中添加组件的方法,今天一起学习通过FactoryBean添加组件的方法. 首先我们准备一个类,也就是我们需要注册进spring的ioc容器中的类 类Color: // 不必 ...

  6. Centos7挂载新硬盘

    1.查看系统是否检测到新的硬盘设备 ls /dev/ |grep sd linux 中所有外设都会在这个目录下,对应一个文件,其中第一块硬盘是sda,第二块硬盘是sdb,第三块硬盘是sdc.其中sda ...

  7. Mechanical Simulation借助UE发力自动驾驶仿真

    Source https://www.unrealengine.com/en-US/blog/making-autonomous-vehicles-safer-before-they-hit-the- ...

  8. Python开发之规范化目录

    13.规范化目录 规范目录优点: 可读性高 加载快 查询修改简 规范化目录结构 (1) start.py文件:首要配置启动文件,运行run()就可以执行项目 #start import sys imp ...

  9. CF1090H Linearization 构造、位运算、前缀和

    传送门 有点神仙的题目 首先注意到对于串\(s\),\(b=s_0\)一定会比\(b = s_0 \bigoplus 1\)更优 考虑先分析linear串的性质.注意到位运算考虑按位处理.我们考虑\( ...

  10. AspNetCore网关集成Swagger访问使用IdentityServer保护的webapi项目

    创建webapi项目 创建四个webapi项目,两个处理业务,一个网关,一个验证中心.四个项目对应的端口如下, ApiGateway:1999 IdentityServer:16690 Service ...