C#并发编程之异步编程(二)

电脑杂谈  发布时间:2019-08-23 15:08:03  来源:网络整理

c 异步编程_c#异步编程_异步编程是什么

事件处置程序读取并等待 AccessTheWebAsync 异步方式。 AccessTheWebAsync 创建HttpClient实例并读取GetStringAsync异步途径,获取的内容字符串方式返回。 GetStringAsync 中出现了某种状况,该情况挂起了它的进程。可能需要期待其他阻碍任务完成。为防止阻止资源,GetStringAsync 会将控制权出让给其调用方 AccessTheWebAsync。 GetStringAsync 返回Task<TResult>,其中 TResult 为字符串,并且 AccessTheWebAsync 将任务分配给 getStringTask 变量。该任务将读取GetStringAsync正在进行的进程,在读入完成时产生返回字符串给urlcontent。 由于尚未等待 getStringTaskAccessTheWebAsync 可以继续执行而不依赖于 GetStringAsync 最终结果的完成。该任务继续调用同步方式 DoIndependentWork。 DoIndependentWork 作为一个同步方式,在自身工作完成后返回到调用方。

AccessTheWebAsync 已运行完毕,可以不受 getStringTask 的结果妨碍。接下来,AccessTheWebAsync 需要计算并返回已下载的字符串的长度,但该方式只有在获取字符串的状况下就能估算该值。 因此,AccessTheWebAsync 使用一个 await 运算符来挂起其任务,并把控制权交给调用 AccessTheWebAsync 的事件处置程序。 AccessTheWebAsync 将 Task<int>返回给调用方。该任务将估算下载字符串长度。 GetStringAsync 完成并生成一个字符串结果。字符串结果不是通过按你预期的方法读取 GetStringAsync 所返回的。(记住,该方式已返回步骤 3 中的一个任务)。相反,字符串结果传输在表示 getStringTask 方法完成的任务中。await 运算符从 getStringTask 中检索结果。赋值语句将检索到的结果赋给 urlContents。 当 AccessTheWebAsync 获取字符串结果时,该方式可以换算字符串长度。然后,AccessTheWebAsync 工作也将完成,并且等待事件处置程序的继续使用。事件处理程序也将最后获取字符串的长度信息。

如果 GetStringAsync(因此 getStringTask)在 AccessTheWebAsync 等待前完成,则控制权会保留在 AccessTheWebAsync中。如果异步读取过程 (AccessTheWebAsync) 已完成c 异步编程,并且 AccessTheWebSync 不必期待最后结果,则挂起然后返回到 getStringTask 将导致资源耗费。

c 异步编程_c#异步编程_异步编程是什么

在调用方内部(此例子中的事件处置程序),处理方式将继续。在期待结果前,调用方可以启动不依赖于 AccessTheWebAsync 结果的其他工作,否则就需等待片刻。事件处置程序等待 AccessTheWebAsync,而 AccessTheWebAsync 等待 GetStringAsync。

事件处置程序读取并等待 AccessTheWebAsync 异步方式。 AccessTheWebAsync 创建HttpClient实例并读取GetStringAsync异步途径,获取的内容字符串方式返回。 GetStringAsync 中出现了某种状况,该情况挂起了它的进程。可能需要期待其他阻碍任务完成。为防止阻止资源,GetStringAsync 会将控制权出让给其调用方 AccessTheWebAsync。 GetStringAsync 返回Task<TResult>,其中 TResult 为字符串,并且 AccessTheWebAsync 将任务分配给 getStringTask 变量。该任务将读取GetStringAsync正在进行的进程,在读入完成时产生返回字符串给urlcontent。 由于尚未等待 getStringTaskAccessTheWebAsync 可以继续执行而不依赖于 GetStringAsync 最终结果的完成。该任务继续调用同步方式 DoIndependentWork。 DoIndependentWork 作为一个同步方式,在自身工作完成后返回到调用方。

AccessTheWebAsync 已运行完毕,可以不受 getStringTask 的结果妨碍。接下来,AccessTheWebAsync 需要计算并返回已下载的字符串的长度,但该方式只有在获取字符串的状况下就能估算该值。 因此,AccessTheWebAsync 使用一个 await 运算符来挂起其任务,并把控制权交给调用 AccessTheWebAsync 的事件处置程序。 AccessTheWebAsync 将 Task<int>返回给调用方。该任务将计算下载字符串长度。 GetStringAsync 完成并生成一个字符串结果。字符串结果不是通过按你预期的方法读取 GetStringAsync 所返回的。(记住,该方式已返回步骤 3 中的一个任务)。相反,字符串结果传输在表示 getStringTask 方法完成的任务中。await 运算符从 getStringTask 中检索结果。赋值语句将检索到的结果赋给 urlContents。 当 AccessTheWebAsync 获取字符串结果时,该方式可以换算字符串长度。然后,AccessTheWebAsync 工作也将完成,并且等待事件处置程序的继续使用。事件处理程序也将最后获取字符串的长度信息。

如果 GetStringAsync(因此 getStringTask)在 AccessTheWebAsync 等待前完成,则控制权会保留在 AccessTheWebAsync中。如果异步读取过程 (AccessTheWebAsync) 已完成,并且 AccessTheWebSync 不必期待最后结果,则挂起然后返回到 getStringTask 将导致资源耗费。

c#异步编程_异步编程是什么_c 异步编程

在调用方内部(此例子中的事件处置程序),处理方式将继续。在期待结果前,调用方可以启动不依赖于 AccessTheWebAsync 结果的其他工作,否则就需等待片刻。事件处置程序等待 AccessTheWebAsync,而 AccessTheWebAsync 等待 GetStringAsync。

在.NET异步编程中,async和await不会创建其他句柄,同时异步方式不会在其自身线程上运行,因此它不需要多线程。只有当手段进入活动状况时,该方式将在当前同步上下文中运行并使用泛型上的时间。可以使用Task.Run将占用大量CPU的工作移到后台线程,但是后台线程不会帮助正在期待结果的进程变为可用状况。

对于异步编程而言,基于异步的方式优于几乎每个用例中的现有方法。具体而言,这种方式优于BackgroundWorker的I/O绑定操作因为代码更简单且无需防止争用条件。结合Task.Run使用时,异步编程比BackgroundWorker更适用于CPU绑定的操作,因为异步编程将运行代码的协调细节与Task.Run传输至线程池的工作区分开来。

那么异步编程对泛型的影响又是什么呢,相比大家需要都明白,ASP.NET中有两类线程,工作线程,和IO线程。

c 异步编程_c#异步编程_异步编程是什么

其中工作线程处理普通请求的线程,也是我们用得最多的线程。这个线程是有限的,是根CPU的个数相关的。IO线程,比如与文件读写,网络操作等是可以异步实现使得使功耗降低的地方。I/O线程一般状况下是空闲的。所以可以使用IO线程来替代工作线程,一方面充分利用了平台资源c 异步编程,另一方面也节约了工作线程调度及切换所带来的消耗。

由此我们应该知道,在I/O密集型处理时,使用异步可以带来巨大的提高,比如操作以及网络操作。

即便异步编程带来功耗的提高,但是采用不慎,也会对平台性能造成反作用,比如直接使用Task.Run或者Task.Factory.StartNew所带来的异步编程,这些方法会占用工作线程以及工作线程之间的切换。

异步编程需要切记的地方

c#异步编程_异步编程是什么_c 异步编程

1、同时async和await侵入性或者传递性很强,所有读取的地方都应该同步使用async和await,这对平台中老代码的更改形成了巨大的影响。

2、异步编程中能够使用lock锁,因为异步方式不会在自身线程上运行,lock就变成了多余的了。但异步编程场景下可以使用AsyncLock锁,对相应的代码进行锁定。

3、异步编程里,比较推荐的做法是导致上线文延续,此处不再做更多说明,参考我的前一篇文章《异步编程(一)》

4、异步编程是否真的提高了平台功耗,目前来看大多数场景下是提高了,尤其在I/O操作比较密集的业务场景下,比如查询和网络读取。

1、同时async和await侵入性或者传递性很强,所有读取的地方都应该同步使用async和await,这对平台中老代码的更改形成了巨大的影响。

2、异步编程中能够使用lock锁,因为异步方式不会在自身线程上运行,lock就变成了多余的了。但异步编程场景下可以使用AsyncLock锁,对相应的代码进行锁定。

3、异步编程里,比较推荐的做法是导致上线文延续,此处不再做更多说明,参考我的前一篇文章《异步编程(一)》

4、异步编程是否真的提高了平台功耗,目前来看大多数场景下是提高了,尤其在I/O操作比较密集的业务场景下,比如查询和网络读取。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-120303-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...