文章: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. Jq如何获取并操作iframe中的元素?

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  2. 【视频开发】【Live555】摄像头采集,264编码,live555直播

    加入 摄像头采集和264编码,再使用live555直播 1.摄像头采集和264编码 将x264改成编码一帧的接口,码流不写入文件而是直接写入内存中(int  Encode_frame 函数中). /* ...

  3. Kubernetes集群安装(自己搭过,已搭好)

    k8s安装目录 1. 组件版本 && 集群环境 组件版本 etcd 集群 && k8s master 机器 && k8s node 机器 集群环境变量 ...

  4. LeetCode 22. 括号生成(Generate Parentheses)

    22. 括号生成 22. Generate Parentheses 题目描述 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结 ...

  5. Spring Boot取消默认tomcat启动,打成war包发布到服务器运行

    一.设置打包方式 在pom.xml中设置打包格式 <packaging>war</packaging> 二.取消Spring Boot的tomcat <!--部署成war ...

  6. Java开发笔记(一百三十)Swing的选择框

    不管是AWT还是Swing,都把选择框分成两类:复选框和单选按钮,这两类控件无论是外观上还是功能上均有显著差异.例如,在外观方面,复选框是在方框内打勾,而单选按钮是在圆圈内画圆点:在功能方面,复选框允 ...

  7. new/delete与命名空间

    目录 1. new/delete 2. 命名空间 1. new/delete C++中的动态内存分配 C++通过new关键字进行动态内存申请 C++中的动态内存申请是基于类型进行的 delete关键字 ...

  8. Centos 安装mysql8

    Centos 安装mysql ,转载 https://www.cnblogs.com/funbin/p/11154784.html 1.下载mysql wget -i -c https://repo. ...

  9. Nmap脚本使用

    Nmap是主机扫描工具,他的图形化界面是Zenmap,分布式框架为Dnamp. Nmap可以完成以下任务: 主机探测 端口扫描 版本检测 系统检测 支持探测脚本的编写 Nmap在实际中应用场合如下: ...

  10. 使用ImagesPipeline时候报错为:ModuleNotFoundError: No module named 'scrapy.contrib'

    刚开始我是这样写的: 报错为: 哈哈,经过查阅资料,其实他是存在的,接下来修改如下: 经过运行结果如下: 问题解决,哈哈哈,搞定!!!!!!!!!!!!