我有一个MT应用程序,可以从互联网下载内容(例如-大量图像- 10K到5MB)。一个下载会话可以代表千兆字节的数据。我已经将下载包在Parallel中。ForEach循环,这工作,但似乎不使用任何超过一个线程在设备上下载(我希望至少两个,以减少下载时间)。
注意:平行。ForEach 让在模拟器中创建多个线程。我是否应该将所有下载作为任务扔到线程池中?我应该启动自己的队列和线程并绕过线程池吗?我知道线程池的大小与设备相匹配,所以这可能不是最好的选择。
当涉及到IO时,只有应用程序开发人员知道他想要多少并行性。不要依赖TPL——它对IO一无所知。
通过手动启动正确数量的任务,使用具有精确并行度的PLINQ或使用异步IO(无线程)来创建适当数量的IO并行性。
您是否通过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
并自己保存文件