• C#中的ConcurrentExclusiveSchedulerPair类


    为什么使用ConcurrentExclusiveSchedulerPair?

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

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

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

    ConcurrentExclusiveSchedulerPair类介绍

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

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

    var pair = new ConcurrentExclusiveSchedulerPair();
    

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

    并发调度器

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

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

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

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

    独占调度器

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

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

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

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

    下面是完整案例

    var pair = new ConcurrentExclusiveSchedulerPair();
    
    var concurrentTaskFactory = new TaskFactory(pair.ConcurrentScheduler);
    var exclusiveTaskFactory = new TaskFactory(pair.ExclusiveScheduler);
    // 调度独占任务
    exclusiveTaskFactory.StartNew(() =>
    {
    	Console.WriteLine("线程:{0}上正在执行独占任务1", Thread.CurrentThread.ManagedThreadId);
    	Thread.Sleep(1000);
    });
    exclusiveTaskFactory.StartNew(() =>
    {
    	Console.WriteLine("线程:{0}上正在执行独占任务2", Thread.CurrentThread.ManagedThreadId);
    	Thread.Sleep(1000);
    });
    
    // 等待所有任务完成
    Task.WaitAll(
    concurrentTaskFactory.StartNew(() =>
    {
    	Console.WriteLine("并发任务3在线程:{0}上执行", Thread.CurrentThread.ManagedThreadId);
    }),
    exclusiveTaskFactory.StartNew(() =>
    {
    	Console.WriteLine("独占任务3正在线程:{0}上执行", Thread.CurrentThread.ManagedThreadId);
    	Thread.Sleep(1000);
    }));
    

    输出结果

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

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

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

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

    结论

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

    作者 => 百宝门瞿佑明

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

  • 相关阅读:
    Visual Studio 2019 c#的winform开发,基本操作
    Springboot毕业设计毕设作品,助农农产品销售系统 开题报告
    重点来了,具有优质脂肪的坚果居然是减肥的好帮手!
    day54
    elementui <el-autocomplete> querySearchAsync 搜索手机号码,补全信息
    Eureka处理流程
    【LeetCode题目详解】第九章 动态规划part13 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组 (day52补)
    微信小程序反编译
    web网页设计期末课程大作业——香格里拉旅游网页设计 5页 HTML+CSS+JavaScript
    Testng监听器
  • 原文地址:https://www.cnblogs.com/baibaomen-org/p/17679008.html