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

  • HowToBasic

    HowToBasic

    8 Aralık 2011
  • infodirt

    infodirt

    11 Mart 2009
  • rekjavicxxx

    rekjavicxxx

    28 EKİM 2007