当我们的程序运行时,调用了一段异步的逻辑A,这段异步的逻辑无法转化为同步(如动画、下载进度等)

而,我们又需要等待异步逻辑A处理完成,然后再执行其它逻辑B。

AutoResetEvent 同步转异步

AutoResetEvent autoResetEvent = new AutoResetEvent(false)

AutoResetEvent 可以在线程间发送信号互相通信,通过调用 AWaitOne 来等待信号,调用Set发送信息来启动已等待的线程。

很简单:一个await ,另一个set来唤醒。

  1. AutoResetEvent autoResetEvent = new AutoResetEvent(false)--参数bool:若要将初始状态设置为终止,则为 true;若要将初始状态设置为非终止,则为 false
  2. await Task.Run(() => { autoResetEvent.WaitOne(); });
  3. 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

最新文章

  1. CloudSim4.0报错NoClassDefFoundError,Caused by: java.lang.ClassNotFoundException: org.apache.commons.math3.distribution.UniformRealDistribution
  2. XUtils 3 使用
  3. ios 给图片添加水印
  4. Flume-NG中Transaction并发性探究
  5. 处理字符串中的换行,将textarea中的带有换行的字符串变为逗号分隔的写法
  6. fbx 模型转换 export
  7. tlplayer for ios V1.1(附上截图)
  8. Asterisk 安装与配置
  9. C# 让textbox 只能输入数字的方法
  10. 一个C#多线程的工作队列
  11. 100套新鲜免费的PS笔刷下载
  12. Nginx 限流
  13. HashMap是无序的
  14. php中curl返回false的解决办法
  15. 详解PROTOCOL BUFFERS
  16. U3D外包公司—北京动点(公司性质)承接U3D、Kinect、VR虚拟现实,增强现实,体感互动,大屏互动等各类外包
  17. # 20175120 2018.3.10 《Java程序设计》第2周学习总结
  18. LOJ2687 BOI2013 Vim 线头DP
  19. windows特殊文件或文件夹
  20. JIRA敏捷sprint需求统计设置

热门文章

  1. YAPI windows 二次开发 树形结构 多层级结构 拖拽 数据导入 接口自动化测试
  2. C语言程序设计100例之(15):除法算式
  3. 【linux知识】文件存储结构及物理设备命名(FHS)
  4. npm报错及解决
  5. mySql中Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre的问题
  6. 【问题记录】 Linux分区磁盘占满,导致ssh登陆闪退
  7. 通过修改VAD属性破除锁页机制
  8. C#Winform窗体利用单例子窗体传值父窗体
  9. ADO.NET ORM数据库增删改查封装(工具一)
  10. Oracle数据库之第一篇