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

  • Abe Olandres

    Abe Olandres

    16 EYLÜL 2006
  • Ben Schoon

    Ben Schoon

    23 Kasım 2012
  • Excel Video Tutorials

    Excel Video

    6 Aralık 2012