我们应该使用async / await来下载大量数据吗?

时间:2015-02-05 04:28:55

标签: c# multithreading asynchronous

根据我的理解,async / await将使用ThreadPool线程执行异步操作,我们更喜欢Threadpool线程,因为操作将在更短的时间内完成,因此线程池线程将提前免费。

因此,如果我们使用async / await或Task来下载大量数据,那么它是否会影响应用程序性能,因为线程池线程不会提前释放,而Threadpool将不得不创建新线程(这是一项昂贵的操作)。

还有一件事,如果async / await在上面的场景中不可取,那么下载大量数据应该是什么?我们应该明确地创建新线程。

请提前分享您的想法和感谢..... :)):)

3 个答案:

答案 0 :(得分:2)

Async IO在运行时不使用线程。这就是重点。

异步IO不会使IO更快。它只会改变它的启动和完成方式。对于大文件下载,它将获得零性能。

答案 1 :(得分:0)

一些更正,根据文档和我所解释的ThreadPools没有创建线程的开销。因此,它提供了避免“线程创建开销和线程处理”的优点。

Quoted

  

线程池通常具有最大线程数。如果所有线程都忙,则将其他任务放入队列,直到可以在线程可用时为其提供服务。

所以是的, MANY 下载同时 COULD 超过ThreadPool中可用的线程数

最后你的主要问题:是的async / await是一个很好的文件下载解决方案。好的tutorial我曾经用过一段时间。

答案 2 :(得分:0)

在这种情况下,你绝对应该使用async / await。使用async / await不会阻塞调用线程,因此不会导致创建新线程。

  

async和await关键字不会导致创建其他线程。异步方法不需要多线程,因为异步方法不能在自己的线程上运行。

而且你在询问IO操作,使用async / await非常适合这个:

  

基于异步的异步编程方法比较好   几乎在每种情况下现有的方法。特别是这种方法   对于IO绑定操作,它比BackgroundWorker更好,因为   代码更简单,你不必防范竞争条件。

MSDN article有更多详情。