我有一个MT应用程序,可以从互联网上下载内容(前很多图像 - 10K到5MB)。一个下载会话可以表示千兆字节的数据。我已经将下载包装在Parallel.ForEach循环中并且可以正常工作,但似乎没有使用设备上的任何一个线程进行下载(我希望至少有两个减少下载时间)。
注意:Parallel.ForEach 确实在模拟器中创建多个线程。我应该将所有下载作为任务放入线程池吗?我应该启动自己的队列和线程并绕过线程池吗?我知道线程池可以扩展以匹配设备,因此这可能不是最佳选择。
答案 0 :(得分:1)
您是通过HTTP下载的吗?我发现WebClient类适用于您所描述的类型。
类似的东西:
WebClient client = new WebClient();
client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
client.DownloadFileAsync("http://stackoverflow.com", "test.txt");
void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
//file finished downloading
}
这样就不需要自己管理线程了。
此外,如果您想立即从文件中读取数据,您可能只想使用
DownloadDataAsync
自己保存文件。
答案 1 :(得分:1)
说到IO,只有应用程序开发人员知道他想要多少并行性。不要依赖于TPL - 它对IO一无所知。
通过手动启动正确数量的任务,使用具有精确并行度的PLINQ或使用异步IO(无线程)来自己创建适当数量的IO并行性。