经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
C#中的ConcurrentExclusiveSchedulerPair类
来源:cnblogs  作者:百宝门园地  时间:2023/9/6 10:54:55  对本文有异议

为什么使用ConcurrentExclusiveSchedulerPair?

现实生活中的例子是一个停车场的入口和出口,多辆车可以同时进入和离开停车场,但是只有一个车辆可以进入或离开一次。

这时候就需要保证同时只有一个车辆能够访问停车场的入口或出口,避免出现多辆车同时进出停车场的竞态条件和导致车辆堵塞的问题。

使用ConcurrentExclusiveSchedulerPair可以将需要独占访问的停车场入口和出口操作加入ExclusiveScheduler中,从而保证在任何时候都只有一个车辆能够进入或离开停车场,避免了竞态条件和数据不一致的情况。

ConcurrentExclusiveSchedulerPair类介绍

ConcurrentExclusiveSchedulerPair类是.NET Framework 4.0中引入的一种新的多线程编程工具,它提供了两个调度器,一个是并发调度器(ConcurrentScheduler),另一个是独占调度器(ExclusiveScheduler)。通过这两个调度器,可以实现多个任务的并行执行和互斥访问。

以下是创建ConcurrentExclusiveSchedulerPair对象的基本代码:

  1. var pair = new ConcurrentExclusiveSchedulerPair();

在上述代码中,我们创建了一个ConcurrentExclusiveSchedulerPair对象。这个对象包含了两个调度器:并发调度器和独占调度器。

并发调度器

并发调度器是一种可以让多个任务并行执行的调度器。在并发调度器中,任务可以同时执行,而不需要等待其他任务完成。

以下是使用并发调度器来执行任务的示例:

  1. var pair = new ConcurrentExclusiveSchedulerPair();
  2. var concurrentScheduler = pair.ConcurrentScheduler;
  3. Task.Factory.StartNew(() =>
  4. {
  5. // 任务执行的代码
  6. }, CancellationToken.None, TaskCreationOptions.None, concurrentScheduler);

在上述代码中,我们获取了ConcurrentExclusiveSchedulerPair对象的并发调度器,并使用Task.Factory.StartNew方法来创建一个任务,并使用并发调度器来调度任务的执行。

独占调度器

独占调度器是一种可以让任务独占执行的调度器。在独占调度器中,只有一个任务可以执行,其他任务必须等待前一个任务完成后才能执行。

以下是使用独占调度器来执行任务的示例:

  1. var pair = new ConcurrentExclusiveSchedulerPair();
  2. var exclusiveScheduler = pair.ExclusiveScheduler;
  3. Task.Factory.StartNew(() =>
  4. {
  5. // 任务执行的代码
  6. }, CancellationToken.None, TaskCreationOptions.None, exclusiveScheduler);

在上述代码中,我们获取了ConcurrentExclusiveSchedulerPair对象的独占调度器,并使用Task.Factory.StartNew方法来创建一个任务,并使用独占调度器来调度任务的执行。

下面是完整案例

  1. var pair = new ConcurrentExclusiveSchedulerPair();
  2. var concurrentTaskFactory = new TaskFactory(pair.ConcurrentScheduler);
  3. var exclusiveTaskFactory = new TaskFactory(pair.ExclusiveScheduler);
  4. // 调度独占任务
  5. exclusiveTaskFactory.StartNew(() =>
  6. {
  7. Console.WriteLine("线程:{0}上正在执行独占任务1", Thread.CurrentThread.ManagedThreadId);
  8. Thread.Sleep(1000);
  9. });
  10. exclusiveTaskFactory.StartNew(() =>
  11. {
  12. Console.WriteLine("线程:{0}上正在执行独占任务2", Thread.CurrentThread.ManagedThreadId);
  13. Thread.Sleep(1000);
  14. });
  15. // 等待所有任务完成
  16. Task.WaitAll(
  17. concurrentTaskFactory.StartNew(() =>
  18. {
  19. Console.WriteLine("并发任务3在线程:{0}上执行", Thread.CurrentThread.ManagedThreadId);
  20. }),
  21. exclusiveTaskFactory.StartNew(() =>
  22. {
  23. Console.WriteLine("独占任务3正在线程:{0}上执行", Thread.CurrentThread.ManagedThreadId);
  24. Thread.Sleep(1000);
  25. }));

输出结果

线程:15上正在执行独占任务1

线程:15上正在执行独占任务2

独占任务3正在线程:15上执行

并发任务3在线程:15上执行

结论

总之,使用 ConcurrentExclusiveSchedulerPair 的目的是为了保证在高并发情况下,多个任务对共享资源进行读写操作时不会产生竞态条件和数据不一致的问题。这可以提高应用程序的稳定性和可靠性。

作者 => 百宝门瞿佑明

原文地址:https://blog.baibaomen.com/c中的concurrentexclusiveschedulerpair类/

原文链接:https://www.cnblogs.com/baibaomen-org/p/17679008.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号