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

时间:2015-09-26 17:37:42

标签: c# multithreading

我知道很多时候都会问过这类问题,但我真的无法决定在ThreadThread pool之间应该使用什么。

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

我曾经使用Thread下载每个文件和观察排队下载,但是当我想停止下载(呼叫Thread.Abort)时会出现奇怪的问题。

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

那么,我应该如何使用这样的长时间运行?

编辑,我使用HttpWebRequest,HttpWebResponse和Stream进行下载,因为我想计算BPS,ETA和限制(从HttpWebResponse获取)。

Edit2,我使用WPF作为用户界面,计算并上升大约4 PropertyChanged事件,我很抱歉我没有提供足够的信息。

2 个答案:

答案 0 :(得分:2)

  

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

都不是。

对于有效的方法,请使用异步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)

答案 1 :(得分:1)

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

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

这里是manual

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

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

以下是invoke a process from c#的方法。