Nasıl g/Ç işlemleri eşzamanlı uyumsuz miktarını sınırlamak için?
// let's say there is a list of 1000 URLs
string[] urls = { "http://google.com", "http://yahoo.com", ... };
// now let's send HTTP requests to each of these URLs in parallel
urls.AsParallel().ForAll(async (url) => {
var client = new HttpClient();
var html = await client.GetStringAsync(url);
});
Burada sorun, aynı anda 1000 adet web istekleri başlar. Kolay bir yol bu zaman uyumsuz bir http isteği eşzamanlı miktar sınırı var mı? 20'den fazla web sayfaları herhangi bir zamanda indirilen. Nasıl en verimli şekilde bunu yapmak için?
CEVAP
Kesinlikle bu zaman uyumsuz yazılımları ile yapabilirsiniz .NET kullanarak .NET 4.5 Beta. 'Usr' iyi bir makale Stephen Toub tarafından yazılmış bir işaret, ama daha az duyurulan haber uyumsuz semafor aslında Beta sürümü haline getirdiler .önceki yazı NET 4.5
Bakarsanız bizim sevgili SemaphoreSlim
Sınıf (olmalıdır hangi kullanarak bu yana daha fazla ölçülebilir daha özgün Semaphore
), Şimdi vardır WaitAsync(...)
serisi aşırı, tüm beklenen değişkenler - zaman aşımı aralıkları iptal belirteçleri, her zamanki gibi zamanlama arkadaşlar :)
Stephen da yeni hakkında daha yeni bir blog yazısı yazılmış .Beta ile Gelen NET 4.5 güzellikler: http://blogs.msdn.com/b/pfxteam/archive/2012/02/29/10274035.aspx
Dün, burada, zaman uyumsuz yöntem azaltma için SemaphoreSlim kullanma hakkında bazı örnek kod:
async Task MyOuterMethod() {
// let's say there is a list of 1000 URLs
string[] urls = { "http://google.com", "http://yahoo.com", ... };
// now let's send HTTP requests to each of these URLs in parallel
List<Task> allTasks = new List<Task>();
SemaphoreSlim throttler = new SemaphoreSlim(initialCount: 20);
foreach (var url in urls) {
// do an async wait until we can schedule again
await throttler.WaitAsync();
// using Task.Run(...) to run the lambda in its own parallel
// flow on the threadpool
allTasks.Add(Task.Run(async () => {
try {
var client = new HttpClient();
var html = await client.GetStringAsync(url);
} finally {
throttler.Release();
}
}));
}
// won't get here until all urls have been put into tasks
await Task.WhenAll(allTasks);
// won't get here until all tasks have completed in some way
// (either success or exception)
}
Son olarak, ama muhtemelen değerli bir söz kullanan bir çözümdür VUK tabanlı bir zamanlama. Henüz başlatılmamış olan VUK temsilci bağlı görevler oluşturma ve özel bir görev eşzamanlılık sınırlamak için bir zamanlayıcı için izin verebilirsiniz. Aslında, burada MSDN bir örnek var:
Nasıl verilen kısmi bir isim ile tüm i...
Nasıl bitirmek için zaman uyumsuz olar...
Nasıl Node.js zaman uyumsuz fonksiyonl...
Nasıl İnputFilter bir EditText karakte...
Nasıl eşzamanlı olarak birbiri ardına/...