我应该使用线程或线程池下载文件
本文关键字:线程 下载 文件 我应该 | 更新日期: 2023-09-27 18:14:35
我知道这种问题被问了很多次,但我真的不知道在Thread
和Thread 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)
更容易使用
Task<int> ReadAsync(byte[] buffer,
int offset, int count, CancellationToken cancellationToken)
我曾经做过一个通过rpc将aria2与c#结合起来的项目。这非常有效。无论你是利用aria2还是仅仅从它的概念中收集,都取决于你,但我鼓励你至少看一看。
提示为了获得最佳性能,您的文件服务器需要支持http范围请求。
手册
要调用它,您只需要路径中的可执行文件。然后调用它。
aria2c "http://host/file.zip"