首页 > 编程语言 >C#中的ConcurrentExclusiveSchedulerPair类

C#中的ConcurrentExclusiveSchedulerPair类

时间:2023-09-17 14:35:35浏览次数:40  
标签:ConcurrentExclusiveSchedulerPair 独占 C# 调度 并发 任务 执行

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类/

标签:ConcurrentExclusiveSchedulerPair,独占,C#,调度,并发,任务,执行
From: https://www.cnblogs.com/sexintercourse/p/17708718.html

相关文章

  • 二十五、QT的BLE蓝牙操作,连接ECB02蓝牙模块收发信息
    1.注意事项(1)pro文件中引入bluetooth模块(2)安卓端运行时,需要同时打开蓝牙和定位才能获取到附近的蓝牙设备(3)mingw套件不能在Windows上运行,需要使用MSVC套件编译才能在Windows上运行2.操作步骤(1)使用QBluetoothLocalDevice类对设备蓝牙进行操作,判断设备蓝牙是否开启,开启和关闭设备......
  • 无涯教程-JavaScript - COSH函数
    描述COSH函数返回数字的双曲余弦值。语法COSH(number)争论Argument描述Required/OptionalNumberAnyrealnumberforwhichyouwanttofindthehyperboliccosine.RequiredNotes双曲余弦的公式为-$$COSH\left(z\right)=\frac{e^2+e^{-2}}{2}$$适用......
  • springcloud 集成rabbitmq
    以下是在SpringCloud中使用RabbitMQ的基本步骤:引入依赖:在pom.xml文件中引入以下依赖:<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency><depe......
  • 【LeetCode】删除数对后的最小数组长度
    题目给你一个下标从0开始的非递减整数数组nums。你可以执行以下操作任意次:选择两个下标i和j,满足i<j且nums[i]<nums[j]。将nums中下标在i和j处的元素删除。剩余元素按照原来的顺序组成新的数组,下标也重新从0开始编号。请你返回一个整数,表示执行......
  • TienChin 渠道管理-添加渠道
    在我们平时新建一个全新的Java类,这个类需要存放的包不存在,可以使用如下的方式进行创建:含义就是说,将ChannelVO这个类放在vo这个包当中,如果存在则不创建,存在就将新建的类放入其中。ChannelVO/***@authorBNTang*@version1.0*@description渠道管理,前端展示对象......
  • keycloak k8s 多副本
    keycloak k8s 多副本apiVersion:v1kind:Servicemetadata:name:keycloaklabels:app:keycloakspec:ports:-name:http5port:8084targetPort:8080selector:app:keycloakclusterIP:None---apiVersion:apps/v1kind:......
  • 【语音压缩】基于adpcm实现语音信号压缩与解压缩附Matlab实现
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • C# 常用集合
    ArrayList根据大小动态添加的数据ArrayList不保证进行排序。在执行(操作(例如BinarySearch需要ArrayList排序的))之前,必须ArrayList调用其Sort方法对进行排序。若要维护在添加新元素时自动排序的集合,可以使用SortedSet类。将元素添加到时ArrayList,容量会根据需......
  • TienChin 渠道管理-配置字典常量
    在字典管理当中添加渠道状态channel_status:渠道状态分别为:正常,键值为1,回显样式为success禁用,键值为0,回显样式为info!>有个注意点:Vue3当中v-for与v-if不能写在一起。在上一节编写前端展示渠道信息时,出现了如上图的警告,某个标签的type属性导致的,这是警告,查看......
  • TienChin 渠道管理-字典原理分析
    在上一节当中,我们使用到了字典来进行翻译我们的渠道类型等等字段,那么这一节我们就来分析一下字典的原理。从代码方面先开始分析,我们先来看一下字典的定义,我们是在如下图当中编写了我们的渠道类型,使用,proxy.useDict进行的请求数据,proxy相比之前的Vue2,其实就是Vue本身,相当于V......