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

  • Anthony Cumia

    Anthony Cumi

    5 EYLÜL 2006
  • theatre2film

    theatre2film

    12 NİSAN 2006
  • YouChewBu

    YouChewBu

    26 Ocak 2009

İLGİLİ SORU / CEVAPLAR