2013-04-12 20 views
8

Parallel.Foreach içinde kullanılacak bir async yöntemim var. async yönteminde bir Görev için beklenir. Ancak, testte bekleyiş yok gibi görünüyor, Görev beklemedi. Sorun ne? Kod aşağıdadır.bekliyor

public void method1() 
{ 
    Ilist<string> testList = new IList<string>(){"1","2","3"}; 
    Parallel.ForEach(testList,()=> 
    { 
     method2(); 
    }); 
} 
public async void method2() 
{ 
    await Task.run(()=>{ some other codes here }); 
} 
+0

Bu, bu sorunla ilgili daha ifadeli bir soru ama bunun bir dupe buna en iyi cevabı var: Her şey için kolaylaştırır yüzden Method2 gelenler bitleri kaldırarak öneririm http: // stackoverflow .com/a/11565317/176877 –

+0

Yine de öyle değil: kod örneği, OP'nin async-bekleme ve TPL hakkındaki varsayımlarının başlangıçtan, sorunun sadece kafasını karıştıracak şekilde hatalı olduğunu gösteriyor. –

cevap

2

void async yöntemleri 'ateş ve unut', ve onları tamamlamak için beklemek hiçbir yolu yoktur. Paralel döngünüzde method2 çağrıldığında, hemen döner, böylece döngü yalnızca döngü tamamlanmadan önce method2'daki görevlerin oluşturulmasını sağlar.

method2 - Task numaralı dönüş türünü, örn. Bunu yaparken sadece doğrudan foreach temsilci method2 görevin vücudu çalıştıran daha iyi olmasına karşın

method2().Wait(); 

ile döngü içinde bekleyebilir

public async Task method() 
{ 
    await Task.Run(() { some other code here }); 
} 

.

+0

Evet, haklısınız, işe yarıyor. Yöntem2'de çalışmamın nedeni, çünkü farklı Func'i yönteme geçirmem gerekiyor1. yaratmak, silmek, vb. çok teşekkürler. – user1438980

6

Geç yanıt vermek gerekirse, G/Ç bağlı çalışmayı senkronize olmayan bir şekilde gerçekleştirmenin tersine, CPU'ya bağlı işi paralel olarak gerçekleştirmeye çalışıyorsunuz gibi görünüyor. Parallel.ForEach, paralellikten sorumludur, bu nedenle Task.Run ve async/await'a gerek yok.

public void method1() 
{ 
    Ilist<string> testList = new IList<string>(){"1","2","3"}; 
    Parallel.ForEach(testList,()=> 
    { 
     method2(); 
    }); 
} 
public void method2() 
{ 
    // some other (plain old synchronous) code here 
} 
İlgili konular