c# – async等待CPU计算与IO操作的使用?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – async等待CPU计算与IO操作的使用?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2043字,纯文字阅读大概需要3分钟。
内容图文
![c# – async等待CPU计算与IO操作的使用?](/upload/InfoBanner/zyjiaocheng/803/47dce951431f40fe8007ff9317c2ca7e.jpg)
我已经知道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等待CPU计算与IO操作的使用?全部内容,希望文章能够帮你解决c# – async等待CPU计算与IO操作的使用?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。