ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – async等待CPU计算与IO操作的使用?

2019-06-12 19:52:26  阅读:243  来源: 互联网

标签:c async-await c-5-0 net-4-5


我已经知道async-await保持线程上下文,也处理异常转发等(这有很大帮助).

但请考虑以下示例:

/*1*/   public async Task<int> ExampleMethodAsync()
/*2*/   {
/*3*/       var httpClient = new HttpClient(); 
/*4*/      
/*5*/       //start async task...
/*6*/       Task<string> contentsTask = httpClient.GetStringAsync("http://msdn.microsoft.com");
/*7*/   
/*8*/       //wait and return...  
/*9*/       string contents = await contentsTask;
/*10*/   
/*11*/       //get the length...
/*12*/       int exampleInt = contents.Length;
/*13*/       
/*14*/       //return the length... 
/*15*/       return exampleInt;
/*16*/   }

如果异步方法(httpClient.GetStringAsync)是一个IO操作(就像我上面的示例中那样)那么 – 我获得了这些东西:

>未阻止来电者线程
>工作线程已释放,因为存在IO操作(IO完成端口…)(GetStringAsync使用TaskCompletionSource而不是打开新线程)
>保留线程上下文
>异常被抛回

但是,如果不是httpClient.GetStringAsync(IO操作),我有一个CalcFirstMillionsDigitsOf_PI_Async的任务(在sperate线程上的重计算绑定操作)

似乎我在这里获得的唯一的东西是:

>保留线程上下文
>异常被抛回
>未阻止来电者线程

但我还有另一个执行操作的线程(并行线程).并且cpu在主线程和操作之间切换.

我的诊断是否正确?

解决方法:

实际上,在这两种情况下,您只能获得第二组优势. await不会启动任何异步执行,它只是编译器生成处理完成,上下文等代码的关键字.

你可以在’“Invoke the method with await”… ugh!‘中找到一个更好的解释,由Stephen Toub.

由异步方法本身决定如何实现异步执行:

>某些方法将使用Task在ThreadPool线程上运行其代码,
>有些人会使用一些IO完成机制.甚至还有一个特殊的ThreadPool,可以在任务with a custom TaskScheduler中使用
>有些会将TaskCompletionSource包装在其他机制上,如事件或回调.

在每种情况下,它都是释放线程的特定实现(如果使用了一个).当Task完成执行时,TaskScheduler会自动释放线程,因此无论如何你都可以获得#1和#2的功能.

回调的情况#3会发生什么,取决于回调的方式.大多数情况下,回调是在由某个外部库管理的线程上进行的.在这种情况下,您必须快速处理回调并返回以允许库重用该方法.

编辑

使用反编译器,可以看到GetStringAsync使用第三个选项:它创建一个TaskCompletionSource,在操作完成时发出信号.执行操作被委托给HttpMessageHandler.

标签:c,async-await,c-5-0,net-4-5
来源: https://codeday.me/bug/20190612/1228039.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有