内容简介:你可以使用临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphores)和事件(Event)来处理线程同步。然而,在编写一些异步处理函数,尤其是还有 async 和 await 使用的时候,还有一些更方便的类型可以用来处理线程同步。使用我们创建一个
你可以使用临界区(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<object> 完成、取消或设置异常的方式让这个 Task 进入完成、取消或错误状态,然后等待它的线程就会继续执行;当然如果有异常,就会让等待的线程收到一个需要处理的异常。
_source.SetResult(null);
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
公众号运营实战手册
中信出版社 / 2018-11 / 58
作者粥左罗在刚入行做新媒体的一年时间里,就写了100篇阅读量10万+的公众号文章,但是在此之前,他足足花了两个月的时间研究公众号运营和爆款文章的逻辑和打法。 这本书就是他总结和归纳自己公众号写作和运营的全部秘诀和技巧,是一本行之有效的实战指南。 从如何注册一个公号,给公号起什么名字? 多长时间更新一次为好? 到如何找选题,如何积累爆款素材? 如何编辑内容,如何做版面设......一起来看看 《公众号运营实战手册》 这本书的介绍吧!