在Monotouch中下载多个文件的推荐模式(异步/多线程)

时间:2013-01-17 16:12:11

标签: c# .net asynchronous xamarin.ios task-parallel-library

我有一个MT应用程序,可以从互联网上下载内容(前很多图像 - 10K到5MB)。一个下载会话可以表示千兆字节的数据。我已经将下载包装在Parallel.ForEach循环中并且可以正常工作,但似乎没有使用设备上的任何一个线程进行下载(我希望至少有两个减少下载时间)。

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

2 个答案:

答案 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并行性。