C# 异步转同步 TaskCompletionSource

本文通过TaskCompletionSource,实现异步转同步

首先有一个异步方法,如下异步任务延时2秒后,返回一个结果

1     private static async Task<string> TestWithResultAsync()2     {3         Debug.WriteLine("1. 异步任务start……");4         await Task.Delay(2000);5         Debug.WriteLine("2. 异步任务end……");6         return "2秒以后";7     }

如何使用TaskCompletionSource将此异步方法转成同步呢?

1     private void TaskCompleteSourceButton_OnClick(object sender, RoutedEventArgs e)2     {3         var result = AwaitByTaskCompleteSource(TestWithResultAsync);4         Debug.WriteLine($"4. TaskCompleteSource_OnClick end:{result}");5     }

TaskCompletionSource使用步骤:

  1. 获取var sourceTask =TaskCompletionSource.Task,
  2. 等待此sourceTask结果-sourceTask.Result
  3. 设置设置sourceTask.Result的结果值
1     private string AwaitByTaskCompleteSource(Func<Task<string>> func) 2     { 3         var taskCompletionSource = new TaskCompletionSource<string>(); 4         var task1 = taskCompletionSource.Task; 5         Task.Run(async () => 6         { 7             var result = await func.Invoke(); 8             taskCompletionSource.SetResult(result); 9         });10         var task1Result = task1.Result;11         Debug.WriteLine($"3. AwaitByTaskCompleteSource end:{task1Result}");12         return task1Result;13     }

测试结果:

关键字:异步转同步,TaskCompletionSource

参考资料:

(0)

相关推荐

  • 聊聊多线程那一些事儿(task)之 一

    多线程,一个多么熟悉的词汇,作为一名程序员,我相信无论是从事什么开发语言,都能够轻轻松松说出几种实现多线程的方式,并且在实际工作种也一定用到过多线程,比如:定时器.异步作业等等,如果你说你没有用过多线 ...

  • 【5min+】帮我排个队,谢谢。await Task.Yield()

    系列介绍 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net ...

  • C# 异步编程

    基于Task的异步编程模式(TAP)是Microsoft为.Net平台下使用Task进行编程所提供的一组建议,这种模式提供了可以被await消耗(调用)方法的APIs,并且当使用async关键字编写遵 ...

  • 一文说通C#中的异步编程

    天天写,不一定就明白. 又及,前两天看了一个关于同步方法中调用异步方法的文章,里面有些概念不太正确,所以整理了这个文章.   一.同步和异步. 先说同步. 同步概念大家都很熟悉.在异步概念出来之前,我 ...

  • 阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端

    关于IO会涉及到阻塞.非阻塞.多路复用.同步.异步.BIO.NIO.AIO等几个知识点.知识点虽然不难但平常经常容易搞混,特此Mark下,与君共勉. 1 阻塞跟非阻塞 1.1 阻塞 阻塞IO 阻塞IO ...

  • 同步FIFO和异步FIFO原理

    AriesOpenFPGA 记录FPGA学习经验,提供FPGA共享开源资料,主要的教程有VHDL,Verilog等 36篇原创内容 公众号 一.使用同步FIFO传输数据 在系统设计期间,有几个工作在不 ...

  • 异步 Python 比同步 Python 快在哪里?

    Python那些事 1周前 原文链接: https://blog.miguelgrinberg.com/post/sync-vs-async-python-what-is-the-difference ...

  • 第三代默纳克NICE3000B系列同步异步机调谐慢车运行(中)

    一.电器接线检查: 1.检查电原输入端子(R/S/T)接线是否正确,牢固. 2.检查控制器与电机接线(UVW)是否正确,牢固. 3.检查控制器(柜).电机是否正确接地. 4.确认安全回路导通,且保证控 ...

  • 学用系列|同步与异步:线上学习中哪个更有效?

    随着我们深入到远程学习领域,课程设计者和讲师必须考虑完全采用虚拟学习的学生的独特需求.在规划未来数周和数月的工作时,教育工作者们正在努力解决一个中心问题:同步或异步学习对远程学习者是否更有效? 现在, ...

  • 直流与交流,同步与异步,有刷与无刷,32页内容了解电机的种类

    电动机的分类 按照电动机工作电源种类的划分: 电机可以分为直流电动机和交流电动机,直流电动机又可以分为无刷直流电动机和有刷直流电动机,其中有刷直流电动机可以分为永磁电动机和电磁直流电动机,交流电动机可 ...

  • 同步、异步、阻塞、非阻塞

    同步.异步.阻塞.非阻塞 目录 同步.异步.阻塞.非阻塞 1.同步 2.异步 3.同步与异步的区别 4.阻塞与非阻塞 5.阻塞非阻塞与同步异步的区别?(故事篇) 1.同步 所谓同步,就是发出一个功能调 ...

  • 深入剖析setState同步异步机制

    关于 setState setState 的更新是同步还是异步,一直是人们津津乐道的话题.不过,实际上如果我们需要用到更新后的状态值,并不需要强依赖其同步/异步更新机制.在类组件中,我们可以通过thi ...

  • 同步复位与异步复位设计技术

    一.导言 在具体讨论同步复位和异步之前,我们先提出一些基本原则以及涉及到的问题,在系统中使用同步复位还是异步复位?他们各有什么优劣?如何处理这些劣势?每个触发器都需要实现复位吗?如何在复杂多时钟域应用 ...