我知道很多时候都会问过这类问题,但我真的无法决定在Thread
或Thread pool
之间应该使用什么。
我正在创建可以同时下载的下载管理器程序。
我曾经使用Thread
下载每个文件和观察排队下载,但是当我想停止下载(呼叫Thread.Abort
)时会出现奇怪的问题。
现在,我正在使用Task.Run
,一切正常,但我担心适用性,因为它可能会持续一分钟到几个小时(很多人都说有线程池有cpu密集型工作,但没有人说像这样长跑。)
那么,我应该如何使用这样的长时间运行?
编辑,我使用HttpWebRequest,HttpWebResponse和Stream进行下载,因为我想计算BPS,ETA和限制(从HttpWebResponse获取)。
Edit2,我使用WPF作为用户界面,计算并上升大约4 PropertyChanged
事件,我很抱歉我没有提供足够的信息。
答案 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#的方法。