Webサービスを通じて50,000のURLのリストを処理したいと考えています。このサービスのプロバイダは1秒あたり5つの接続を許可しています。多数のタスクを同時に非同期に処理する
これらのURLをプロバイダの規則に準拠して処理する必要があります。
これは私の現在のコードです:
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();
Iは、対象のWebサービスの新しいオブジェクトを作成しますが、これは単にコードをジェネリックにすることです。
巨大な接続リストを処理して処理する正しい方法ですか?とにかく、現在の実装では時間枠を考慮しないため、1秒あたりの確立された接続数を5に制限できますか? Webサービスからの
おかげ
Parallel.ForEachループを使用し、並列度を[ここ](http://stackoverflow.com/a/9290531/6170142)に示すように制限できます。 –