请选择 进入手机版 | 继续访问电脑版

[C#教程] C#异步使用 必要 留意 的几个标题

[复制链接]
查看105 | 回复30 | 2021-9-14 12:07:05 | 显示全部楼层 |阅读模式
目次

一、异步模子 的基本概述

异步编程的核心是

  1. Task
复制代码
  1. Task<T>
复制代码
对象,这两个对象对异步操作建模。 它们受关键字
  1. async
复制代码
  1. await
复制代码
的支持。 在大多数环境 下模子 非常 简单:

对于 I/O 绑定代码,当你

  1. await
复制代码
一个操作,它将返回
  1. async
复制代码
方法中的一个
  1. Task
复制代码
  1. Task<T>
复制代码

对于 CPU 绑定代码,当你
  1. await
复制代码
一个操作,它将在后台线程通过
  1. Task.Run()
复制代码
方法启动。

二、C#异步使用 必要 注意 的几个题目

  1. 异步方法假如 只是对别的方法的简单的转发调用,没哟复杂的逻辑(比如等待A的结果 ,再调用B,等待A调用的返回值拿到内部做一些处理再返回),那么就可以去掉async关键字。
  2. 异步方法着实 使用 async 关键字clr多了一些预备 和 转换的处理和线程的切换,服从 反而低。
  3. 异步方法中想停息 一段时间,不要用thread.sleep(),由于 他会壅闭 调用线程导致当前界面卡无相应 ,而要用await task.delay(); 比方 6秒后下载一个文件
  4. 异步中的CancellationToken 参数,用于提前制止 使命 ,比如取消使命 ,哀求 超时

三、CancellationToken 布局 体

  • None 空
  • bool IsCancellationToken 是否取消
  • Register(action callback)注册取消监听
  • ThrowIfCancellationRequested 假如 使命 被取消,实验 到这句话就抛非常
  • CancellationTokenSource 来创建 CancellationToken
  • CancelAfter()超时后发出取消信号
  • Cancel()发出取消信号
  • CancellationToken Token
  1. static async Task Main(string[] args)
  2. {
  3. CancellationTokenSource cts = new CancellationTokenSource();
  4. cts.CancelAfter(5000); //超时5s后取消
  5. await DownloadString("http://www.baidu.com", 50, cts.Token);
  6. }
复制代码

1.手动取消

  1. if (cancellationToken.IsCancellationRequested)
  2. {
  3. Console.WriteLine("任务被取消");
  4. break;
  5. }
复制代码

2.使用 方法取消,抛出非常

  1. cancellationToken.ThrowIfCancellationRequested();
复制代码

3. 传参数取消

体系 自带的异步方法,只必要 传参数就可取消,抛出非常

  1. var resp= await client.GetAsync(url,cancellationToken);
复制代码

4.手动触发变乱 取消使命

  1. static async Task Main(string[] args)
  2. {
  3. CancellationTokenSource cts = new CancellationTokenSource();
  4. //cts.CancelAfter(5000);
  5. DownloadString("http://www.baidu.com", 100, cts.Token); //和超时区别在于去掉了前面的await 才生效
  6. while (Console.ReadLine() != "q")
  7. {
  8. }
  9. cts.Cancel();
  10. Console.ReadLine();
  11. }
复制代码

  1. .Asp.net core Mvc
复制代码
控制器内里 的异步方法只管 带
  1. CancellationToken
复制代码

5.Task类方法

    1. WhenAny
    复制代码
    任何一个
    1. Task
    复制代码
    完成,
    1. task
    复制代码
    就完成
    1. WhenAll
    复制代码
    全部 使命 都完成,才完成 。 不在乎
    1. Task
    复制代码
    实验 次序
    1. FromResult
    复制代码
    创建平常 数值的
    1. Task
    复制代码
    对象

6.yield流水线返回

yield 可以流水线返回,进步 性能。

C# 8.0以上支持 yield异步方法的使用

  1. static async IAsyncenumerable<string> test()
  2. {
  3. yield return "a";
  4. yield return "b";
  5. yield return "c";
  6. }
复制代码

调用:

  1. await foreach(var o in test())
  2. {
  3. Console.WriteLine(o);
  4. }
复制代码
  1. public static async Task DownloadString(string url,int num,CancellationToken cancellationToken)
  2. {
  3. try
  4. {
  5. using (var client = new HttpClient())
  6. {
  7. for (int i = 0; i < num; i++)
  8. {
  9. string html = await client.GetStringAsync(url);
  10. Console.WriteLine($"{DateTime.Now}:{html}");
  11. //1.手动取消
  12. if (cancellationToken.IsCancellationRequested)
  13. {
  14. Console.WriteLine("使命 被取消");
  15. break;
  16. }
  17. //2.抛出非常
  18. //cancellationToken.ThrowIfCancellationRequested();
  19. }
  20. }
  21. }
  22. catch (Exception)
  23. {
  24. throw;
  25. }
  26. }
  27. public static async Task Download2String(string url, int num, CancellationToken cancellationToken)
  28. {
  29. using (var client = new HttpClient())
  30. {
  31. for (int i = 0; i < num; i++)
  32. {
  33. var resp= await client.GetAsync(url,cancellationToken);string html =await resp.Content.ReadAsStringAsync();
  34. Console.WriteLine($"{DateTime.Now}:{html}");
  35. //1.手动取消
  36. //if (cancellationToken.IsCancellationRequested)
  37. //{
  38. // Console.WriteLine("使命 被取消");
  39. // break;
  40. //}
  41. //2.抛出非常
  42. //cancellationToken.ThrowIfCancellationRequested();
  43. }
  44. }
  45. }
复制代码

到此这篇关于C#使用 异步必要 注意 的几个题目 的文章就先容 到这了,更多相干 C#使用 异步必要 注意 的题目 内容请搜索 脚本之家从前 的文章或继续欣赏 下面的相干 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 天八部饶gc | 2021-9-14 20:48:02 | 显示全部楼层
admin楼主的头像能辟邪啊!
回复

使用道具 举报

avatar jimmy肖明 | 2021-9-16 23:14:54 | 显示全部楼层
勤奋灌水,天天向上!
回复

使用道具 举报

avatar 索支较 | 2021-9-19 16:46:47 | 显示全部楼层
突然觉得admin楼主说的很有道理,赞一个!
回复

使用道具 举报

avatar 維健_廣律 | 2021-9-19 19:59:54 | 显示全部楼层
我默默的回帖,从不声张!
回复

使用道具 举报

avatar 想出轨逗 | 2021-9-21 04:32:32 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的源码论坛他的站点都是商业源码,还是免费下载的那种!特别好用。访问地址:http://www.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 知足常乐77 | 2021-9-21 21:32:36 | 显示全部楼层
我对admin楼主的敬仰犹如滔滔江水绵延不绝!
回复

使用道具 举报

avatar fck1956272 | 2021-9-26 23:29:38 | 显示全部楼层
楼上的真不讲道理!
回复

使用道具 举报

avatar 王丽梅 | 2021-10-1 22:15:37 | 显示全部楼层
这个帖子会火的,鉴定完毕!
回复

使用道具 举报

不错的帖子,值得收藏!
回复

使用道具 举报

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

本版积分规则