2

我有一个 MT 应用程序,可以从 Internet 下载内容(例如 - 大量图像 - 10K 到 5MB)。一个下载会话可以代表千兆字节的数据。我已将下载包装在 Parallel.ForEach 循环中,并且可以正常工作,但似乎在设备上使用的下载线程不止一个(我希望至少有两个线程来减少下载时间)。

注意:Parallel.ForEach确实在模拟器中创建了多个线程。我应该将所有下载作为任务放入线程池吗?我应该启动自己的队列和线程并绕过线程池吗?我知道线程池可以缩放以匹配设备,因此这可能不是最佳选择。

4

2 回答 2

1

在 IO 方面,只有应用程序开发人员知道他想要多少并行度。不要依赖 TPL——它对 IO 一无所知。

通过手动启动正确数量的任务、使用具有精确并行度的 PLINQ 或使用异步 IO(无线程)来自己创建适量的 IO 并行度。

于 2013-01-17T19:01:28.167 回答
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

并自己保存文件。

于 2013-01-17T16:45:28.283 回答