我应该使用线程或线程池下载文件

本文关键字:线程 下载 文件 我应该 | 更新日期: 2023-09-27 18:14:35

我知道这种问题被问了很多次,但我真的不知道在ThreadThread pool之间我应该使用什么。

我正在创建可以同时下载的下载管理器程序。

我曾经使用Thread下载每个文件和观察排队下载,但有奇怪的问题,当我想停止下载(调用Thread.Abort)。

现在,我使用Task.Run,一切工作正常,但我担心的适用性,因为它可能运行从一分钟到几个小时(很多人说线程池与cpu密集型工作,但没有人说长时间运行像这样)。

那么,对于这种长时间运行的操作,我应该使用什么呢?

编辑,我使用HttpWebRequest, HttpWebResponse和流下载,因为我想计算BPS, ETA和节流(从HttpWebResponse获得)。

Edit2,我使用WPF作为UI,计算并上升了大约4个PropertyChanged事件,很抱歉我一开始没有提供足够的信息

我应该使用线程或线程池下载文件

我应该使用线程或线程池下载

对于一种有效的方法,使用异步I/O。具体方式取决于API,但现在有几个接口与async/await兼容。

例如,


- WebClient.DownloadFileAsync(Uri, String)已经很有效了
- WebClient.DownloadFileTaskAsync(Uri, String)更容易使用

对于来自HttpWebResponse的流,你可以使用(Fx 4.5及以上)
Task<int> ReadAsync(byte[] buffer, 
  int offset, int count, CancellationToken cancellationToken)

我曾经做过一个通过rpc将aria2与c#结合起来的项目。这非常有效。无论你是利用aria2还是仅仅从它的概念中收集,都取决于你,但我鼓励你至少看一看。

提示为了获得最佳性能,您的文件服务器需要支持http范围请求。

手册

要调用它,您只需要路径中的可执行文件。然后调用它。

aria2c "http://host/file.zip"