2012-05-31 28 views
6

Zaman uyumsuz çağrı yapan bir kitaplık kullanıyorum ve yanıt döndüğünde sonuçta bir geri arama yöntemi çağrılır. Bu takip edilmesi gereken basit bir model ama şimdi bir engele çarpıyorum. Eşzamansız yöntemlere birden çok çağrı yapabilir ve bunlar için beklemeyi (engellemeden) nasıl yapabilirim? Tüm hizmetlerden veri aldığımda, async yöntemiyle döndürülen iki (veya daha fazla) değeri alacak olan kendi geri arama yöntemimi çağırmak isterim.Birden çok geri arama bekle

Buradan izlenecek doğru model nedir? Bu arada, kütüphaneyi TPL veya başka bir şey kullanmak için değiştiremiyorum ... Onunla yaşamak zorundayım.

public static void GetDataAsync(Action<int, int> callback) 
{ 
    Service.Instance.GetData(r1 => 
    { 
     Debug.Assert(r1.Success); 
    }); 

    Service.Instance.GetData2(r2 => 
    { 
     Debug.Assert(r2.Success); 
    }); 

    // How do I call the action "callback" without blocking when the two methods have finished to execute? 
    // callback(r1.Data, r2.Data); 
} 

cevap

6

Ne istediğinizi CountdownEvent gibi bir şeydir. Bu (.NET 4.0 üzerinde olduğunu varsayarsak) deneyin:

public static void GetDataAsync(Action<int, int> callback) 
{ 
    // Two here because we are going to wait for 2 events- adjust accordingly 
    var latch = new CountdownEvent(2); 

    Object r1Data, r2Data;  

    Service.Instance.GetData(r1 => 
    { 
     Debug.Assert(r1.Success); 
     r1Data = r1.Data; 
     latch.Signal(); 
    }); 

    Service.Instance.GetData2(r2 => 
    { 
     Debug.Assert(r2.Success); 
     r2Data = r2.Data; 
     latch.Signal(); 
    }); 

    // How do I call the action "callback" without blocking when the two methods have finished to execute? 
    // callback(r1.Data, r2.Data); 

    ThreadPool.QueueUserWorkItem(() => { 
     // This will execute on a threadpool thread, so the 
     // original caller is not blocked while the other async's run 

     latch.Wait(); 
     callback(r1Data, r2Data); 
     // Do whatever here- the async's have now completed. 
    }); 
} 
2

Sen zaman uyumsuz Yaptığınız çağrı her biri için Interlocked.Increment kullanabilirsiniz. Biri tamamlandığında, Interlocked.Decrement numaralı telefonu arayın ve sıfır değerini kontrol edin, eğer sıfır ise, kendi geriçağırımınızı arayın. Geri arama delegelerinin dışında r1 ve r2 depolamanız gerekir.

İlgili konular