SORU
9 EYLÜL 2012, Pazar


Kullanarak zaman uyumsuz/çoklu görevler için bekliyor

Tamamen asynchrounous bir API client kullanıyorum, diğer bir deyişle, her işlem ya Task Task<T> e döner.g:

static async Task DoSomething(int siteId, int postId, IBlogClient client)
{
    await client.DeletePost(siteId, postId); // call API client
    Console.WriteLine("Deleted post {0}.", siteId);
}

C# 5 zaman uyumsuz kullanarak operatörler bekliyor, birden fazla görevi başlatmak ve onları tamamlamak için tüm beklemek doğru/en etkili yolu nedir:/

int[] ids = new[] { 1, 2, 3, 4, 5 };
Parallel.ForEach(ids, i => DoSomething(1, i, blogClient).Wait());

ya da:

int[] ids = new[] { 1, 2, 3, 4, 5 };
Task.WaitAll(ids.Select(i => DoSomething(1, i, blogClient)).ToArray());

API istemci dahili HttpClient kullanarak bu yana, bu 5 HTTP istekleri hemen, her birini tamamlar gibi konsola yazma sorunu beklenir.

CEVAP
9 EYLÜL 2012, Pazar


int[] ids = new[] { 1, 2, 3, 4, 5 };
Parallel.ForEach(ids, i => DoSomething(1, i, blogClient).Wait());

Yukarıdaki kod ile paralel işlemleri çalışmasına karşın, bu kod, her bir işlem üzerinde çalıştığı her iş parçacığı engeller. Eğer ağ Ara 2 saniye sürer örneğin, her iş parçacığı 2 saniye G/Ç için bir şey yapıyor ama bekleme kilitleniyor.

int[] ids = new[] { 1, 2, 3, 4, 5 };
Task.WaitAll(ids.Select(i => DoSomething(1, i, blogClient)).ToArray());

Diğer taraftan, WaitAll ile yukarıdaki kod aynı zamanda iş parçacığı engeller ve iş parçacığı işlemi bitene kadar başka bir iş işlemek için ücretsiz olmayacak. Operasyonları Paralel uyumsuz olarak gerçekleştirecek WhenAll tercih ederim.

public async Task DoWork() {

    int[] ids = new[] { 1, 2, 3, 4, 5 };
    await Task.WhenAll(ids.Select(i => DoSomething(1, i, blogClient)));
}

Bu yedeklemek için, burada ayrıntılı bir blog yazısı tüm geçiyor alternatifleri ve avantajları/dezavantajları: How and Where Concurrent Asynchronous I/O with ASP.NET Web API

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GWTLecturer

    GWTLecturer

    18 EKİM 2012
  • Kyler Briskey

    Kyler Briske

    20 ŞUBAT 2011
  • placeboing

    placeboing

    7 Mart 2006