前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件

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

作者头像
walterlv
发布2020-02-10 14:33:16
4900
发布2020-02-10 14:33:16
举报

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

2018-12-22 07:50

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

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


等待事件

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

代码语言:javascript
复制
public class WalterlvDemo
{
    private readonly TaskCompletionSource<object> _source = new TaskCompletionSource<object>();

    public Task WaitAsync() => _source.Task;

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

等待时可以同步:

代码语言:javascript
复制
demo.Wait();

也可以异步:

代码语言:javascript
复制
await demo.WaitAsync();

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

引发事件

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

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

TaskCompletionSource 中的方法
TaskCompletionSource 中的方法

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

代码语言:javascript
复制
_source.SetResult(null);
本文会经常更新,请阅读原文: https://blog.walterlv.com/post/use-task-completion-sou

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-12-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
    • 等待事件
      • 引发事件
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档