为什么使用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类/

C#中的ConcurrentExclusiveSchedulerPair类的更多相关文章

  1. Java Native Interfce三在JNI中使用Java类的普通方法与变量

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 前面我们学习了如何在JNI中通过参数来使用J ...

  2. 换个新的思路 代替解压jar包 例证:wechat4j 框架中的templateMsg类

    很多朋友在写java的程序的时候都喜欢用第三方的jar包和框架,有可能遇到jar包中的内容已经跟不上官方开发者文档的更新,导致部分内容出错了,这个时候可能就要放弃这个jar的使用,但是这个jar中的其 ...

  3. 标准C++中的string类的用法总结

    标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...

  4. 带有静态方法的类(java中的math类)

    带有静态方法的类通常(虽然不一定是这样)不打算被初始化. 可以用私有构造函数来限制非抽象类被初始化. 例如,java中的math类.它让构造函数标记为私有,所以你无法创建Math的实例.但Math类却 ...

  5. java-API中的常用类,新特性之-泛型,高级For循环,可变参数

    API中的常用类 System类System类包含一些有用的类字段和方法.它不能被实例化.属性和方法都是静态的. out,标准输出,默认打印在控制台上.通过和PrintStream打印流中的方法组合构 ...

  6. C++中如何定义类和对象?

    在C++语言中,对象的类型被称为类,类代表了某一批对象的共性和特征. 类是对象的抽象,而对象是类的具体实例.如同C中的结构体一样,我们要先定义一个结构体,再使用结构体去定义一个变量.同一个结构体可以定 ...

  7. Oracle数据库中调用Java类开发存储过程、函数的方法

    Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...

  8. 【转载】C++中的基类与派生类

    转自:http://www.cnblogs.com/sujz/articles/2044365.html 派生类的继承方式总结: 继承方式 说明 public 基类的public和protected的 ...

  9. 回调函数中使用MFC类的成员或对话框控件的简单方法

    在MFC的很多程序中,常常需要在回调函数中调用MFC类的类成员变量.类成员函数,亦或者对话框控件的句柄.由于回调函数是基于C编程的Windows SDK的技术,而类成员又有this指针客观条件限制.. ...

  10. Java ClassLoader基础及加载不同依赖 Jar 中的公共类

    转载自:最新内容及最清晰格式请见 http://www.trinea.cn/android/java-loader-common-class/ 本文主要介绍 ClassLoader 的基础知识,Cla ...

随机推荐

  1. 关于ESXi下如何查看磁盘SMART信息(SATA & NVMe)的教程

    ESXi下查看磁盘SMART比较麻烦,并且SATA协议的和NVMe协议的操作不一样,下面分别进行详细陈述 SATA--使用smartctl查看 本部分参考梦幻生命@CSDN(原文链接https://b ...

  2. openlayers 使用canvas绘制圆形头像图标

    记录一个使用canvas 将一张图片等比缩放,裁剪为一个圆 1.原始图片 2.绘制后在地图中呈现的样式 3.设置样式的函数 /** * 设置Style */ setStyleOnPersonLocat ...

  3. 用BP软件 批量注册用户

    第五步:查看管理员后台----用户界面, 有没有批量添加进用户

  4. 2个场景实例讲解GaussDB(DWS)基表统计信息估算不准的处理方案

    摘要:通过2个实例场景讲解GaussDB(DWS)运维解决方案. 本文分享自华为云社区<GaussDB(DWS)运维 -- 基表统计信息估算不准的常见场景及处理方案>,作者:譡里个檔. 场 ...

  5. 暑期实习开始啦「GitHub 热点速览」

    无巧不成书,刚好最近有小伙伴在找实习,而 GitHub 热榜又有收录实习信息的项目在榜.所以,无意外本周特推就收录了这个实习项目,当然还有国内版本.除了应景的实习 repo 之外,还有帮你管理文件的 ...

  6. 如何安装旧版本的 R 包

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 我们在安装 R 包的时候,经常会发现某个最新的包与当前 R 的版本不兼容. > inst ...

  7. CKS 考试题整理 (02)-Apparmor

    Context Apparmor 已在 cluster 的工作节点 node02 上被启用.一个 Apparmor 配置文件已存在,但尚未被实施. Task 在 cluster 的工作节点 node0 ...

  8. 前端vue地图定位并测算当前定位离目标位置距离可用于签到打卡

    前端vue地图定位并测算当前定位离目标位置距离可用于签到打卡, 下载完整代码请访问uni-app插件市场地址: https://ext.dcloud.net.cn/plugin?id=12974 效果 ...

  9. 第四章 IDEA的安装与使用

    网上一大推的教程 ‍

  10. C# 实现 Linux 视频聊天、远程桌面(源码,支持信创国产化环境,银河麒麟,统信UOS)

    园子里的有朋友在下载并了解了<C# 实现 Linux 视频会议(源码,支持信创环境,银河麒麟,统信UOS)>中提供的源码后,留言给我说,这个视频会议有点复杂了,代码比较多,看得有些费劲.问 ...