SORU
29 Mayıs 2012, Salı


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
30 Mayıs 2012, ÇARŞAMBA


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:

http://msdn.microsoft.com/en-us/library/ee789351

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 2ndfloor91

    2ndfloor91

    17 Kasım 2007
  • Elly

    Elly

    3 EKİM 2005
  • iBand IguJoo

    iBand IguJoo

    25 AĞUSTOS 2006