我有一个在asp.net网络api中运行的代码,该代码可从其他站点下载图像文件。
这是我用来下载图像的代码。
foreach (string file in images)
{
using (WebClient client = new WebClient())
{
await client.DownloadFileTaskAsync(file, path + Path.GetFileName(file));
}
}
我真正需要做的是一次开始10次下载。(例如,使用Task.Run ...或其他方式),然后在最初启动的10个文件逐个完成时,逐个启动其余文件。
对于EX。
开始10个任务
等到10个任务之一完成
1完成后,开始另一个任务
当另一个1完成时,开始另一个任务,等等。
直到下载列表中的所有图像。
因此,当代码运行时,我最多可以有10个并发下载(如果没有更多图片可下载,则少于10个)。
我正在使用.net 4.5.2
你们能指出我正确的方向吗?
您可以SemaphoreSlim
用来限制异步工作:
private readonly SemaphoreSlim _mutex = new SemaphoreSlim(10);
...
var downloads = images.Select(file => DownloadAsync(file));
await Task.WhenAll(downloads);
...
private async Task DownloadAsync(string file)
{
await _mutex.WaitAsync();
try
{
using (WebClient client = new WebClient())
{
await client.DownloadFileTaskAsync(file, path + Path.GetFileName(file));
}
}
finally
{
_mutex.Release();
}
}
笔记:
System.Net.ServicePointManager.DefaultConnectionLimit
。Task.Run
在ASP.NET上使用。有关更多详细信息,请参见我最近在async
ASP.NET上发布的MSDN文章。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句