查看: 5|回复: 0

c# ReaderWriterLockSlim 实现多线程读取或进行独占式写入访问

[复制链接]

280

主题

1

回帖

1465

积分

管理员

积分
1465
QQ
发表于 前天 08:23 | 显示全部楼层 |阅读模式
  1.     internal class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             Demo02();
  6.             Console.ReadLine();
  7.         }

  8.         static ReaderWriterLockSlim _lockSlim = new ReaderWriterLockSlim();
  9.         static Dictionary<int, string> _dic = new Dictionary<int, string>();
  10.         static void ReadData(int key)
  11.         {
  12.             Task.Delay(10000).Wait();

  13.             _lockSlim.EnterReadLock();
  14.             try
  15.             {
  16.                 if (_dic.TryGetValue(key, out var value))
  17.                 {
  18.                     Console.WriteLine($"读取{key}的值为{value}");
  19.                 }
  20.                 else
  21.                 {
  22.                     Console.WriteLine($"读取{key}失败");
  23.                 }
  24.             }
  25.             catch
  26.             {
  27.             }
  28.             finally
  29.             {
  30.                 _lockSlim.ExitReadLock();
  31.             }
  32.         }

  33.         static void WriteData(int key)
  34.         {      
  35.             _lockSlim.EnterWriteLock();
  36.             try
  37.             {
  38.                 _dic[key] = DateTime.Now.ToString();
  39.                 Console.WriteLine($"写入{key}:{_dic[key]}");
  40.             }
  41.             catch
  42.             {

  43.             }
  44.             finally
  45.             {
  46.                 _lockSlim.ExitWriteLock();
  47.             }
  48.         }

  49.         static void Demo01()
  50.         {
  51.             new Thread(() => { WriteData(1); }).Start();
  52.             new Thread(() => { WriteData(3); }).Start();
  53.             new Thread(() => { ReadData(1); }).Start();
  54.             new Thread(() => { ReadData(2); }).Start();
  55.             new Thread(() => { ReadData(3); }).Start();
  56.         }

  57.         static bool _isFinsh;
  58.         static string _str;
  59.         static void ReadTask(int key)
  60.         {
  61.             while(!_isFinsh)
  62.             {
  63.                 _lockSlim.EnterReadLock();
  64.                 try
  65.                 {                  
  66.                     Console.WriteLine($"{key}读取:{_str}");                    
  67.                     Thread.Sleep(100);
  68.                     Console.WriteLine($"{key}读取完成:{_str}");
  69.                 }
  70.                 catch
  71.                 {
  72.                 }
  73.                 finally
  74.                 {
  75.                     _lockSlim.ExitReadLock();
  76.                 }
  77.             }
  78.         }

  79.         static void WriteTask(int key)
  80.         {
  81.             while (!_isFinsh)
  82.             {
  83.                 _lockSlim.EnterUpgradeableReadLock();

  84.                 try
  85.                 {
  86.                     if (new Random().NextDouble() > 0.9)
  87.                     {
  88.                         _lockSlim.EnterWriteLock();
  89.                         try
  90.                         {
  91.                             _str = DateTime.Now.ToString();
  92.                             Console.WriteLine($"{key}写入{_str}");
  93.                             Thread.Sleep(4000);
  94.                             Console.WriteLine($"{key}写入完成{_str}");
  95.                         }
  96.                         catch
  97.                         {

  98.                         }
  99.                         finally
  100.                         {
  101.                             _lockSlim.ExitWriteLock();
  102.                         }
  103.                     }
  104.                 }
  105.                 finally
  106.                 {
  107.                     _lockSlim.ExitUpgradeableReadLock();
  108.                 }


  109.             }
  110.         }

  111.         public static async Task Demo02()
  112.         {
  113.             for (int i = 0; i < 5; i++)
  114.             {
  115.                 Task.Run(() =>
  116.                 {
  117.                     ReadTask(i);
  118.                 });
  119.             }

  120.             Task.Run(() => { WriteTask(10); });

  121.             await Task.Delay(5000);
  122.             _isFinsh = true;

  123.         }
  124.     }
  125. }
复制代码


高级模式
B Color Image Link Quote Code Smilies

本版积分规则

关于我们

企业文化

人才招聘

常见问题

建议反馈

合作伙伴

商务合作

新闻媒体

产品服务

客户案例

联系我们

联系电话:14776878570(同VX号)

邮箱:14776878570@163.com(同VX号)

工作时间:周一至周六(早上8点至下午10点)

关注微信公众号

QQ|Archiver|手机版|小黑屋|鸿翔机器人

GMT+8, 2025-11-6 12:35 , Processed in 0.058220 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.