我想通過一個Web服務處理50,000個URL的列表,該服務的提供者允許每秒5個連接。併發和異步處理大量任務
我需要在遵守供應商規則的同時處理這些網址。
這是我當前的代碼:
static void Main(string[] args)
{
process_urls().GetAwaiter().GetResult();
}
public static async Task process_urls()
{
// let's say there is a list of 50,000+ URLs
var urls = System.IO.File.ReadAllLines("urls.txt");
var allTasks = new List<Task>();
var throttler = new SemaphoreSlim(initialCount: 5);
foreach (var url in urls)
{
await throttler.WaitAsync();
allTasks.Add(
Task.Run(async() =>
{
try
{
Console.WriteLine(String.Format("Starting {0}", url));
var client = new HttpClient();
var xml = await client.GetStringAsync(url);
//do some processing on xml output
client.Dispose();
}
finally
{
throttler.Release();
}
}));
}
await Task.WhenAll(allTasks);
}
而不是var client = new HttpClient();
我將創建目標Web服務的一個新的對象,但是這僅僅是爲了讓代碼通用。
這是處理和處理大量連接列表的正確方法嗎?並且無論如何,我可以將每秒建立的連接數限制爲5,因爲當前的實現不考慮任何時間框架?從Web服務
感謝
您可以使用Parallel.ForEach循環並限制其並行度,如[此處](http://stackoverflow.com/a/9290531/6170142)所示。 –