首页 > Windows开发 > 详细

C# 同步转异步 TaskCompletionSource

时间:2019-07-08 00:31:25      阅读:180      评论:0      收藏:0      [点我收藏+]

当我们遇到一些异步执行又无法等待时的逻辑,比如动画的执行。

而业务上又需要等待逻辑的完成,再去处理后续的操作。这时需要转成异步方法

如下,同步执行一个动画后,再输出日志:

1     private async void TaskCompleteSourceAwait_OnClick(object sender, RoutedEventArgs e)
2     {
3         bool isCompleted = await AwaitByTaskCompletionAsync(new Storyboard() { Duration = new Duration(TimeSpan.FromSeconds(2)) });
4         Debug.WriteLine($"TaskCompleteSourceAwait_OnClick end:{isCompleted}");
5     }

通过TaskCompletionSource如何转化为异步方法,并等待动画完成?

 1     /// <summary>
 2     /// 执行动画
 3     /// </summary>
 4     /// <param name="storyboard"></param>
 5     /// <returns></returns>
 6     public static async Task<bool> AwaitByTaskCompletionAsync(Storyboard storyboard)
 7     {
 8         var taskCompletionSource = new TaskCompletionSource<bool>();
 9 
10         Debug.WriteLine("Storyboard start");
11 
12         storyboard.Completed += OnStoryboardCompleted;
13         storyboard.Begin();
14 
15         void OnStoryboardCompleted(object sender, EventArgs e)
16         {
17             Debug.WriteLine("Storyboard end");
18             storyboard.Completed -= OnStoryboardCompleted;
19             taskCompletionSource.SetResult(true);
20         }
21         return await taskCompletionSource.Task;
22     }

测试效果:

技术分享图片

 

参考资料:

 

C# 同步转异步 TaskCompletionSource

原文:https://www.cnblogs.com/kybs0/p/11148904.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!