使用方法:
1.在方法之外添加 ReaderWriterLockSlim类.
2.使用try语句。注意write与read不同。
写
try
{
while (!rwl.TryEnterWriteLock(50))//没有获取到写锁
{
//do other something
}
rwl.EnterReadLock();
//do something
}
finally
{
rwl.ExitWriteLock();
}
读
try
{
rwl.EnterReadLock();
//批量读取公共变量
do something;
}
finally
{
rwl.ExitReadLock();
}
样例代码:
class Program
{
private static ReaderWriterLockSlim rwl = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);//声明静态类,支持递归方式.
private static List<int> testData = new List<int>(){0,1,2,3,4,5};
static void Main(string[] args)
{
var Tasks = new Task[3];
var taskfactory = new TaskFactory(TaskCreationOptions.LongRunning,TaskContinuationOptions.None);
Tasks[0] = taskfactory.StartNew(ReadMethod ,1);
Tasks[1] = taskfactory.StartNew(WriteMethod, 2);
Tasks[2] = taskfactory.StartNew(ReadMethod, 3);
Console.ReadKey();
}
static void WriteMethod(object identification)
{
try
{
while (!rwl.TryEnterWriteLock(50))//没有获取到写锁
{
Console.WriteLine("don't get writeLock");
Console.WriteLine("Current reader count:{0}",rwl.CurrentReadCount);
}
rwl.EnterReadLock();
//写公共变量
for (int i = 0; i < testData.Count; i++)
{
testData[i]+=6;
}
Console.WriteLine("{0} writer is finished", identification);
ReadMethod(55);
}
finally
{
rwl.ExitWriteLock();
}
}
static void ReadMethod(object identification)
{
try
{
rwl.EnterReadLock();
//批量读取公共变量
for (int i = 0; i < testData.Count; i++)
{
Console.WriteLine("{0} reading {1},Current value is {2}", identification, i, testData[i]);
Thread.Sleep(10);
}
}
finally
{
rwl.ExitReadLock();
}
}
}