当前位置: 首页 > news >正文

.NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件

你可以使用临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphores)和事件(Event)来处理线程同步。然而,在编写一些异步处理函数,尤其是还有 async 和 await 使用的时候,还有一些更方便的类型可以用来处理线程同步。

使用 TaskCompletionSource,你可以轻松地编写既可以异步等待,又可以同步等待的代码来。


本文内容

      • 等待事件
      • 引发事件

等待事件

我们创建一个 TaskCompletionSource<object> 对象,这样,我们便可以写出一个既可以同步等待又可以异步等待的方法:

public class WalterlvDemo
{
    private readonly TaskCompletionSource<object> _source = new TaskCompletionSource<object>();

    public Task WaitAsync() => _source.Task;

    public void Wait() => _source.Task.GetAwaiter().GetResult();
}

等待时可以同步:

demo.Wait();

也可以异步:

await demo.WaitAsync();

而同步的那个方法,便可以用来做线程同步使用。

引发事件

要像一个事件一样让同步等待阻塞着的线程继续跑起来,则需要设置这个事件。

TaskCompletionSource<object> 提供了很多让任务完成的方法:

TaskCompletionSource 中的方法

可以通过让这个 TaskCompletionSource<object> 完成、取消或设置异常的方式让这个 Task 进入完成、取消或错误状态,然后等待它的线程就会继续执行;当然如果有异常,就会让等待的线程收到一个需要处理的异常。

_source.SetResult(null);

我的博客会首发于 https://walterlv.com/,而 CSDN 和博客园仅从其中摘选发布,而且一旦发布了就不再更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://blog.csdn.net/wpwalter),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • 使用 WPF 开发一个 Windows 屏幕保护程序
  • 在 Windows 10 中开启移动 WLAN 热点
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • 在 Roslyn 分析语法树时添加条件编译符号的支持
  • 自然码的形码
  • 出于迁移项目的考虑,GitHub 中 Fork 出来的项目,如何与原项目断开 Fork 关系?
  • 只需 5 秒钟,你就能取到 WPF 程序的超高分辨率超高清截图
  • 谨慎使用 FileInfo.Exists 实例方法,而是使用 File.Exists 静态方法替代
  • UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等)
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • int? 竟然真的可以是 null!.NET/C# 确定可空值类型 NullableT 实例的真实类型
  • Slack 开发入门之 Incoming Webhooks:往 Slack 的 Channel 中发消息
  • 三值 bool? 进行与或运算后的结果
  • 为什么我们不应该使用微信或者 QQ 作为团队协作的 IM 工具?
  • 通过重写预定义的 Target 来扩展 MSBuild / Visual Studio 的编译过程
  • python3.6+scrapy+mysql 爬虫实战
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • JavaScript 奇技淫巧
  • leetcode388. Longest Absolute File Path
  • mysql 数据库四种事务隔离级别
  • opencv python Meanshift 和 Camshift
  • SQLServer之创建数据库快照
  • SQLServer之创建显式事务
  • 安卓应用性能调试和优化经验分享
  • 当SetTimeout遇到了字符串
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 跨域
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 浅谈Golang中select的用法
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (6)添加vue-cookie
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (蓝桥杯每日一题)love
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • .NET 材料检测系统崩溃分析
  • .Net 高效开发之不可错过的实用工具
  • .Net 垃圾回收机制原理(二)
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @AliasFor注解
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @synthesize和@dynamic分别有什么作用?
  • [.NET]桃源网络硬盘 v7.4
  • [20150904]exp slow.txt
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [Avalon] Avalon中的Conditional Formatting.
  • [C#]winform部署yolov5-onnx模型