C# System.Threading.ReaderWriterLockSlim
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Generic; public class SynchronizedCache
{
private ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim();
private Dictionary<int, string> innerCache = new Dictionary<int, string>(); public int Count
{ get { return innerCache.Count; } } public string Read(int key)
{
cacheLock.EnterReadLock();
try
{
return innerCache[key];
}
finally
{
cacheLock.ExitReadLock();
}
} public void Add(int key, string value)
{
cacheLock.EnterWriteLock();
try
{
innerCache.Add(key, value);
}
finally
{
cacheLock.ExitWriteLock();
}
} public bool AddWithTimeout(int key, string value, int timeout)
{
if (cacheLock.TryEnterWriteLock(timeout))
{
try
{
innerCache.Add(key, value);
}
finally
{
cacheLock.ExitWriteLock();
}
return true;
}
else
{
return false;
}
} public AddOrUpdateStatus AddOrUpdate(int key, string value)
{
cacheLock.EnterUpgradeableReadLock();
try
{
string result = null;
if (innerCache.TryGetValue(key, out result))
{
if (result == value)
{
return AddOrUpdateStatus.Unchanged;
}
else
{
cacheLock.EnterWriteLock();
try
{
innerCache[key] = value;
}
finally
{
cacheLock.ExitWriteLock();
}
return AddOrUpdateStatus.Updated;
}
}
else
{
cacheLock.EnterWriteLock();
try
{
innerCache.Add(key, value);
}
finally
{
cacheLock.ExitWriteLock();
}
return AddOrUpdateStatus.Added;
}
}
finally
{
cacheLock.ExitUpgradeableReadLock();
}
} public void Delete(int key)
{
cacheLock.EnterWriteLock();
try
{
innerCache.Remove(key);
}
finally
{
cacheLock.ExitWriteLock();
}
} public enum AddOrUpdateStatus
{
Added,
Updated,
Unchanged
}; ~SynchronizedCache()
{
if (cacheLock != null) cacheLock.Dispose();
}
}
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Generic; public class Example
{
public static void Main()
{
var sc = new SynchronizedCache();
var tasks = new List<Task>();
int itemsWritten = ; // Execute a writer.
tasks.Add(Task.Run( () => { String[] vegetables = { "broccoli", "cauliflower",
"carrot", "sorrel", "baby turnip",
"beet", "brussel sprout",
"cabbage", "plantain",
"spinach", "grape leaves",
"lime leaves", "corn",
"radish", "cucumber",
"raddichio", "lima beans" };
for (int ctr = ; ctr <= vegetables.Length; ctr++)
sc.Add(ctr, vegetables[ctr - ]); itemsWritten = vegetables.Length;
Console.WriteLine("Task {0} wrote {1} items\n",
Task.CurrentId, itemsWritten);
} ));
// Execute two readers, one to read from first to last and the second from last to first.
for (int ctr = ; ctr <= ; ctr++) {
bool desc = Convert.ToBoolean(ctr);
tasks.Add(Task.Run( () => { int start, last, step;
int items;
do {
String output = String.Empty;
items = sc.Count;
if (! desc) {
start = ;
step = ;
last = items;
}
else {
start = items;
step = -;
last = ;
} for (int index = start; desc ? index >= last : index <= last; index += step)
output += String.Format("[{0}] ", sc.Read(index)); Console.WriteLine("Task {0} read {1} items: {2}\n",
Task.CurrentId, items, output);
} while (items < itemsWritten | itemsWritten == );
} ));
}
// Execute a red/update task.
tasks.Add(Task.Run( () => { Thread.Sleep();
for (int ctr = ; ctr <= sc.Count; ctr++) {
String value = sc.Read(ctr);
if (value == "cucumber")
if (sc.AddOrUpdate(ctr, "green bean") != SynchronizedCache.AddOrUpdateStatus.Unchanged)
Console.WriteLine("Changed 'cucumber' to 'green bean'");
}
} )); // Wait for all three tasks to complete.
Task.WaitAll(tasks.ToArray()); // Display the final contents of the cache.
Console.WriteLine();
Console.WriteLine("Values in synchronized cache: ");
for (int ctr = ; ctr <= sc.Count; ctr++)
Console.WriteLine(" {0}: {1}", ctr, sc.Read(ctr)); }
}
// The example displays the following output:
// Task 1 read 0 items:
//
// Task 3 wrote 17 items
//
//
// Task 1 read 17 items: [broccoli] [cauliflower] [carrot] [sorrel] [baby turnip] [
// beet] [brussel sprout] [cabbage] [plantain] [spinach] [grape leaves] [lime leave
// s] [corn] [radish] [cucumber] [raddichio] [lima beans]
//
// Task 2 read 0 items:
//
// Task 2 read 17 items: [lima beans] [raddichio] [cucumber] [radish] [corn] [lime
// leaves] [grape leaves] [spinach] [plantain] [cabbage] [brussel sprout] [beet] [b
// aby turnip] [sorrel] [carrot] [cauliflower] [broccoli]
//
// Changed 'cucumber' to 'green bean'
//
// Values in synchronized cache:
// 1: broccoli
// 2: cauliflower
// 3: carrot
// 4: sorrel
// 5: baby turnip
// 6: beet
// 7: brussel sprout
// 8: cabbage
// 9: plantain
// 10: spinach
// 11: grape leaves
// 12: lime leaves
// 13: corn
// 14: radish
// 15: green bean
// 16: raddichio
// 17: lima beans
构造函数
ReaderWriterLockSlim() |
使用默认属性值初始化 ReaderWriterLockSlim 类的新实例。 |
ReaderWriterLockSlim(LockRecursionPolicy) |
在指定锁定递归策略的情况下初始化 ReaderWriterLockSlim 类的新实例。 |
属性
CurrentReadCount |
获取已进入读取模式锁定状态的独有线程的总数。 |
IsReadLockHeld |
获取一个值,该值指示当前线程是否已进入读取模式的锁定状态。 |
IsUpgradeableReadLockHeld |
获取一个值,该值指示当前线程是否已进入可升级模式的锁定状态。 |
IsWriteLockHeld |
获取一个值,该值指示当前线程是否已进入写入模式的锁定状态。 |
RecursionPolicy |
获取一个值,该值指示当前 ReaderWriterLockSlim 对象的递归策略。 |
RecursiveReadCount |
获取当前线程进入读取模式锁定状态的次数,用于指示递归。 |
RecursiveUpgradeCount |
获取当前线程进入可升级模式锁定状态的次数,用于指示递归。 |
RecursiveWriteCount |
获取当前线程进入写入模式锁定状态的次数,用于指示递归。 |
WaitingReadCount |
获取等待进入读取模式锁定状态的线程总数。 |
WaitingUpgradeCount |
获取等待进入可升级模式锁定状态的线程总数。 |
WaitingWriteCount |
获取等待进入写入模式锁定状态的线程总数。 |
方法
Dispose() |
释放 ReaderWriterLockSlim 类的当前实例所使用的所有资源。 |
EnterReadLock() |
尝试进入读取模式锁定状态。 |
EnterUpgradeableReadLock() |
尝试进入可升级模式锁定状态。 |
EnterWriteLock() |
尝试进入写入模式锁定状态。 |
Equals(Object) |
确定指定的对象是否等于当前对象。 (Inherited from Object) |
ExitReadLock() |
减少读取模式的递归计数,并在生成的计数为 0(零)时退出读取模式。 |
ExitUpgradeableReadLock() |
减少可升级模式的递归计数,并在生成的计数为 0(零)时退出可升级模式。 |
ExitWriteLock() |
减少写入模式的递归计数,并在生成的计数为 0(零)时退出写入模式。 |
GetHashCode() |
作为默认哈希函数。 (Inherited from Object) |
GetType() |
获取当前实例的 Type。 (Inherited from Object) |
MemberwiseClone() |
创建当前 Object 的浅表副本。 (Inherited from Object) |
ToString() |
返回表示当前对象的字符串。 (Inherited from Object) |
TryEnterReadLock(Int32) |
尝试进入读取模式锁定状态,可以选择整数超时时间。 |
TryEnterReadLock(TimeSpan) |
尝试进入读取模式锁定状态,可以选择超时时间。 |
TryEnterUpgradeableReadLock(Int32) |
尝试进入可升级模式锁定状态,可以选择超时时间。 |
TryEnterUpgradeableReadLock(TimeSpan) |
尝试进入可升级模式锁定状态,可以选择超时时间。 |
TryEnterWriteLock(Int32) |
尝试进入写入模式锁定状态,可以选择超时时间。 |
TryEnterWriteLock(TimeSpan) |
尝试进入写入模式锁定状态,可以选择超时时间。 |
C# System.Threading.ReaderWriterLockSlim的更多相关文章
- c# System.Threading.Thread
using System; using System.Threading; // Simple threading scenario: Start a static method running // ...
- .Net多线程编程—System.Threading.Tasks.Parallel
System.Threading.Tasks.Parallel类提供了Parallel.Invoke,Parallel.For,Parallel.ForEach这三个静态方法. 1 Parallel. ...
- System.Threading.Timer 定时器的用法
System.Threading.Timer 是C# 中的一个定时器,可以定时(不断循环)执行一个任务.它是在线程上执行的,具有很好的安全性.为此 .Net Framework 提供了5个重载的构造 ...
- C# System.Threading.Timer 使用方法
public class TimerHelper { System.Threading.Timer timer; public TaskSendMMS tasksendmms { get; set; ...
- C#中的线程四(System.Threading.Thread)
C#中的线程四(System.Threading.Thread) 1.最简单的多线程调用 System.Threading.Thread类构造方法接受一个ThreadStart委托,改委托不带参数,无 ...
- C#错误之 System.Threading.ThreadAbortException:正在中止线程
参考:http://www.cnblogs.com/chendaoyin/archive/2013/06/27/3159211.html 1.开启一个子线程 //开启一个子线程,子线程调用方法 Met ...
- System.Threading.Timer使用心得
System.Threading.Timer 是一个使用回调方法的计时器,而且由线程池线程服务,简单且对资源要求不高. "只要在使用 Timer,就必须保留对它的引用."对于任何托 ...
- “System.Threading.ThreadAbortException”类型的第一次机会异常在 mscorlib.dll 中发
问题原因: Thread.Abort 方法 .NET Framework 4 其他版本 1(共 1)对本文的评价是有帮助 - 评价此主题 在调用此方法的线程上引发 ThreadAbortExce ...
- System.Threading.ThreadAbortException: 正在中止线程。
在 System.Threading.ThreadAbortException 中第一次偶然出现的"mscorlib.dll"类型的异常 "System.Threadin ...
随机推荐
- python接口自动化测试十五:解决密码动态,无法登录情况
解决问题:每次密码都是变化的,无法通过账号密码登录 (总不能每次去fiddler复制吧????) 解决思路: 1.先用selenium调用浏览器(不会selenium的自己想办法了), 2.登录后从浏 ...
- HDU1711 Number Sequence(KMP模板题)
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- Java多线程系列目录
java多线程学习: 传送门:Java多线程系列目录(共43篇)
- HTTP协议特点
1 HTTP协议特点 1)客户端->服务端(请求request)有三部份 a)请求行--请求行用于描述客户端的请求方式.请求的资源名称,以及使用的HTTP协议版本号 请 ...
- Redis 5.0 集群搭建
Redis 5.0 集群搭建 单机版的 Redis 搭建 https://www.jianshu.com/p/b68e68bbd725 /usr/local/目录 mkdir redis-cluste ...
- 查看Windows系统里的进程已运行的时间
搜索 ProcessExplorer ,可以去微软下载它.右键点击项类,selcet conlumns...在 Process Performance 里 选择start time.有了进程的启动时间 ...
- python实现的椭圆曲线加密
我也看得云里雾里, 但是ECC和RSA并列为非对称加密双雄, 还是很有必要了解一下的. RSA是用质数分解,ECC是用离散的椭圆方程解,安全度更高. 而且,这个ECC的加法乘法规则,和普通都不一样, ...
- java:给你一个数组和两个索引,交换下标为这两个索引的数字
给你一个数组和两个索引,交换下标为这两个索引的数字 import java.util.Arrays; public class Solution { public static void main(S ...
- HDU4686 Arc of Dream 矩阵
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - HDU4686 题意概括 a0 = A0 ai = ai-1*AX+AY b0 = B0 bi = bi-1* ...
- 洛谷 P1507 NASA的食物计划 【二维费用背包】 || 【DFS】
题目链接:https://www.luogu.org/problemnew/show/P1507 题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安全技术问题一直大伤脑筋,因此在各方压力 ...