Simple WPF: C# 使用基本的async/await实现异步

打印 上一主题 下一主题

主题 862|帖子 862|积分 2586

最新内容优先发布于个人博客:小虎技能分享站,随后渐渐搬运到博客园。
创作不易,如果觉得有用请在Github上为博主点亮一颗小星星吧!
博主开始学习编程于11年前,年少时还只会使用cin 和cout ,给单片机点点灯。那时候,雷同async/await 和future/promise 模子的认知还不是很够,因此一直使用着最传统的Thread 模子实现异步。顶多使用ThreadPool 线程池来实现对线程资源的复用。而现在我们有更当代方法,在.net 环境下可以使用当代C# 提供的async/await关键字方便地实现基于任务异步模子的异步调用。
完整代码下载见:Github
一个基本的异步方法

假设我们定义以下这个异步方法模子,在函数上作用async 关键字实现在控制台异步输出字符串。
  1. static async Task FooAsync()
  2. {
  3.     Console.WriteLine("Foo.");
  4. }
复制代码
突然发现VS2022的提示说由于没有Task.Run大概await照旧同步方法。。。

根据这个提示我们修改上述的方法使之满足异步方法的要求
  1. static async Task FooAsync()
  2. {
  3.     Task.Run(() => Console.WriteLine("Foo."));
  4. }
复制代码
为了展示各种简单的异步方法,我们写了以下的demo来演示
  1. namespace AsyncBasic
  2. {
  3.     internal class Program
  4.     {
  5.         static async Task BasicFuncAsync()
  6.         {
  7.             await Task.Run(
  8.                 () => Console.WriteLine("Hello Basic Func Async.")
  9.             );
  10.         }
  11.         static async Task LoopFuncAsync()
  12.         {
  13.             for (int i = 0; i < 10; i++)
  14.             {
  15.                 Console.WriteLine($"Loop func {i}.");
  16.                 await Task.Delay(100);
  17.             }
  18.         }
  19.         static async Task FooAsync()
  20.         {
  21.             Console.WriteLine("Foo.");
  22.         }
  23.         static async Task<int> BasicFuncWithRetAsync()
  24.         {
  25.             Console.WriteLine("Basic func with return value.");
  26.             await Task.Delay(1000);
  27.             return 10086;
  28.         }
  29.         static async IAsyncEnumerable<int> GenerateEnumerableAsync()
  30.         {
  31.             for (int i = 0; i < 10; ++i)
  32.             {
  33.                 yield return i;
  34.                 await Task.Delay(100);
  35.             }
  36.         }
  37.         static async Task Main(string[] args)
  38.         {
  39.             Console.WriteLine("Hello Async Basic.");
  40.             Task task1 = LoopFuncAsync();
  41.             Task task2 = BasicFuncAsync();
  42.             Task<int> task3 = BasicFuncWithRetAsync();
  43.             Task.WaitAny(task2, task3);
  44.             Console.WriteLine($"Basic Func Async ret value: {task3.Result}");
  45.             Task.WaitAll(task1, task2, task3);
  46.             Console.WriteLine($"Generate Enumerable Async");
  47.             await foreach (int i in GenerateEnumerableAsync())
  48.             {
  49.                 Console.WriteLine($"Async Enumerable: {i}");
  50.             }
  51.         }
  52.     }
  53. }
复制代码
值得一提的是C# 8.0以后可以使用await foreach 来消耗异步产生的列表
本文展示了基本的异步方法使用,筹划后续再撰文记载异步方法的取消功能等更高级话题。
演示效果如下:

参考链接

https://learn.microsoft.com/zh-cn/dotnet/csharp/asynchronous-programming/task-asynchronous-programming-model
https://www.cnblogs.com/cplemom/p/14290789.html

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表