2015-06-05 40 views
12

Tüm async görevlerinin tamamlanmasını beklemeye karar vermemeye çalışıyorum. İşte Task.WhenAll() öğesine iletilen görevlerde ConfigureAwait (false) kullanma

ben bunu denedim bu yüzden senkronizasyon bağlam alakalı değildir oldukça eminim Şu anda

[HttpGet] 
public async Task<JsonResult> doAsyncStuff() 
{ 
    var t1 = this.service1.task1(); 
    var t2 = this.service2.task2(); 
    var t3 = this.service3.task3(); 
    var t4 = this.service4.task4(); 

    await Task.WhenAll(t1,t2,t3,t4); 
    return this.Json(new {redirect = true, href = Url.Action("Blah")}, JsonRequestBehavior.AllowGet); 
} 

sahip koddur.

[HttpGet] 
public async Task<JsonResult> doAsyncStuff() 
{ 
    var t1 = this.service1.task1().ConfigureAwait(false); 
    var t2 = this.service2.task2().ConfigureAwait(false); 
    var t3 = this.service3.task3().ConfigureAwait(false); 
    var t4 = this.service4.task4().ConfigureAwait(false); 

    await Task.WhenAll(t1,t2,t3,t4); 
    return this.Json(new {redirect = true, href = Url.Action("Blah")}, JsonRequestBehavior.AllowGet); 
} 

sorun artık o Yapılandırılan Görev Awaiatables kabul etmeyecektir, çünkü Task.WhenAll geçersiz argümanlar vardır.

Yani Task.WhenAll Bu henüz neredeyse her kimse o kötü kokan eğer ", onu kullanın edilir ConfigureAwait hakkında söyleyecek bir şeyi yok, bana doğru görünmüyor bu

await t1; await t2; await t3; await t4; 

ile değiştirilmesi gerekmektedir t hatası ". Ve bildiğim kadarıyla (görevleri ben yazmadım), Senkronize Bağlamı kullanmıyorlar, ne de ona güveniyorlar.

Dikkat edilmesi gereken önemli Görev1'in görev4'ten önceki bir son işlemeye güvenmediği için aynı anda çalışmasını istiyorum. Sonuç olarak, her görev için beklemek istemiyorum. Ama Json cevabını tüm 4 tamamlanana kadar iade etmek istemiyorum, bu yüzden şu anki kodda Task.WhenAll() 'ı beklemiyorum. Aslında await gerçekleştirdiğinizde

+0

tanımlamak olurdu * ... * Daha iyi –

+1

Ben gerçek sorunu ve sorunun biraz daha temsilci olmak için başlık güncellenmiş Eğer istiyorsan, onu değiştirebilirsin ama "hangisi daha iyi" soruları çözülüyorsa ve insanların asıl sorunuzu okumadıkları dizaltı reaksiyonlarına neden olacaklar. –

+0

"Configure * Task *", "Configure * Task *" değil. –

cevap

28

Sadece ConfigureAwait gerek doğru biçim

[HttpGet] 
public async Task<JsonResult> doAsyncStuff() 
{ 
    var t1 = this.service1.task1(); 
    var t2 = this.service2.task2(); 
    var t3 = this.service3.task3(); 
    var t4 = this.service4.task4(); 

    await Task.WhenAll(t1,t2,t3,t4).ConfigureAwait(false); 
    return this.Json(new {redirect = true, href = Url.Action("Blah")}, JsonRequestBehavior.AllowGet); 
} 
+3

@YuvalItzchakov Her görevde bunu yapamaz. 'ConfigureAwait', beklediğiniz görevin davranışını değil 'beklemenin' davranışını değiştirir. SyncContext'leri bir 'bekle' seçeneğine dönüşene kadar değiştirme şansınız yok, her 4 görev yine de her satırda 'ConfigureAwait' komutunu koymuş olsa bile iş parçacığıyla birlikte gelen senkronizasyon bağlamında başlayacak, sonra da 't1'i bekliyordu; t2'yi bekliyor; t3'ü bekliyor; sonunda bekle t4; –

+0

@ScottChamberlain Haklısınız. Bir şekilde karıştırdım. –

+0

@ScottChamberlain Teşekkürler, bu çok daha mantıklı ve çok daha temiz görünüyor. Bir sebepten ötürü internet hemen beklemekte olan çözümlerle doludur ve hiç kimse asenkronize olarak birden çok görevi çalıştırmayı düşünmemişti. – vipero07

İlgili konular