C# 同步转异步 AutoResetEvent
当我们的程序运行时,调用了一段异步的逻辑A,这段异步的逻辑无法转化为同步(如动画、下载进度等)
而,我们又需要等待异步逻辑A处理完成,然后再执行其它逻辑B。
AutoResetEvent 同步转异步
AutoResetEvent autoResetEvent = new AutoResetEvent(false)
AutoResetEvent 可以在线程间发送信号互相通信,通过调用 AWaitOne 来等待信号,调用Set发送信息来启动已等待的线程。
很简单:一个await ,另一个set来唤醒。
- AutoResetEvent autoResetEvent = new AutoResetEvent(false)--参数bool:若要将初始状态设置为终止,则为 true;若要将初始状态设置为非终止,则为 false
- await Task.Run(() => { autoResetEvent.WaitOne(); });
- autoResetEvent.Set();
比如:
private async Task SetDelegateProgress()
{
var delegateProgress = new UIDelegateProgress();
delegateProgress.ProgressCompleted += () =>
{
autoResetEvent.Set();
};
DelegateProgress = delegateProgress;
await Task.Run(() => { autoResetEvent.WaitOne(); });
}
如上案例,当delegateProgress执行完后,通过AutoResetEvent 的方法Set来发送信息来唤醒子线程。
再如动画的同步等待处理:
/// <summary>
/// 执行动画
/// </summary>
/// <param name="storyboard"></param>
/// <returns></returns>
public static async Task ExecuteStoryboradAsync([NotNull] Storyboard storyboard)
{
if (storyboard == null) throw new ArgumentNullException(nameof(storyboard)); AutoResetEvent autoResetEvent = new AutoResetEvent(false); storyboard.Completed += OnStoryboardCompleted;
storyboard.Begin(); void OnStoryboardCompleted(object sender, EventArgs e)
{
storyboard.Completed -= OnStoryboardCompleted;
autoResetEvent.Set();
} await Task.Run(() => { autoResetEvent.WaitOne(); });
}
值得注意的是,WaitOne只能在子线程,如果放在主线程的话,会将整个线程终止(例如界面或者其它后台逻辑)
AutoResetEvent 可以在多个线程使用WaitOne来暂停线程,而暂停的线程则需要多次set来开启暂停的线程。
给你AutoResetEvent 类似的,还有一个ManualResetEvent。ManualResetEvent 是多个暂停线程,可以通过一次set直接开启全部暂停的线程。
ManualResetEvent与AutoResetEvent 不同的还有Reset方法,Reset与Set相反,为主动暂停线程。
详细ManualResetEvent & AutoResetEvent可参考:https://www.cnblogs.com/maitian-lf/p/3672390.html
缺陷
使用AutoResetEvent的确可以由同步转成异步方法,但是以上方案是创建了一个新的任务,如果是大量的处理会有性能问题~
关键字:动画同步,AutoResetEvent
参考资料:
最新文章
- CloudSim4.0报错NoClassDefFoundError,Caused by: java.lang.ClassNotFoundException: org.apache.commons.math3.distribution.UniformRealDistribution
- XUtils 3 使用
- ios 给图片添加水印
- Flume-NG中Transaction并发性探究
- 处理字符串中的换行,将textarea中的带有换行的字符串变为逗号分隔的写法
- fbx 模型转换 export
- tlplayer for ios V1.1(附上截图)
- Asterisk 安装与配置
- C# 让textbox 只能输入数字的方法
- 一个C#多线程的工作队列
- 100套新鲜免费的PS笔刷下载
- Nginx 限流
- HashMap是无序的
- php中curl返回false的解决办法
- 详解PROTOCOL BUFFERS
- U3D外包公司—北京动点(公司性质)承接U3D、Kinect、VR虚拟现实,增强现实,体感互动,大屏互动等各类外包
- # 20175120 2018.3.10 《Java程序设计》第2周学习总结
- LOJ2687 BOI2013 Vim 线头DP
- windows特殊文件或文件夹
- JIRA敏捷sprint需求统计设置
热门文章
- YAPI windows 二次开发 树形结构 多层级结构 拖拽 数据导入 接口自动化测试
- C语言程序设计100例之(15):除法算式
- 【linux知识】文件存储结构及物理设备命名(FHS)
- npm报错及解决
- mySql中Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre的问题
- 【问题记录】 Linux分区磁盘占满,导致ssh登陆闪退
- 通过修改VAD属性破除锁页机制
- C#Winform窗体利用单例子窗体传值父窗体
- ADO.NET ORM数据库增删改查封装(工具一)
- Oracle数据库之第一篇