2012-01-16 16 views
8

में सिंक्रनाइज़िंग क्रियाएं मेरे पास एक सिल्वरलाइट ऐप है जो मॉडल से डेटा प्राप्त करने के लिए कार्रवाइयों का उपयोग करता है (जो फिर से डब्ल्यूसीएफ सेवाओं से डेटा प्राप्त करता है)।सिल्वरलाइट

मुझे किसी भी तरह से दो एक्शनकॉलबैक सिंक करने की आवश्यकता है, या उनके लिए प्रतीक्षा करें, और उसके बाद कुछ कोड निष्पादित करें।

उदाहरण:

_model.GetMyTypeList(list => 
{ 
    MyTypeList.AddRange(list); 
}); 

_model.GetStigTypeList(list => 
{ 
    StigTypeList.AddRange(list); 
}); 

doSomethingWhenBothHaveReturned(); 

मैं जानता हूँ कि मैं एक काउंटर का उपयोग कर सकते हैं कि कितने वापस आ गया है का ट्रैक रखने के लिए, लेकिन वहाँ यह करने के लिए एक बेहतर तरीका नहीं है?

संपादित करें: उपयोगकर्ता 24601 का एक अच्छा जवाब है, लेकिन SilverdownEvent Silverlight, किसी अन्य महान विचारों में मौजूद नहीं है? :)

+0

सुनिश्चित नहीं हैं, लेकिन मुझे लगता है [प्रतिक्रियाशील एक्सटेंशन] (http://msdn.microsoft.com/en-us/data/gg577609) आपकी मदद कर सकता है। –

+0

क्या सेवाओं asyncrouns के लिए कॉल हैं? – Glenn

+0

हां वे ग्लेन हैं। – randoms

उत्तर

4

समस्या मेरी स्वयं हल:: 'अधिक सुरुचिपूर्ण' समाधान के लिए उलटी गिनती घटना का उपयोग करने के होगा

public class ActionWaitHandler 
{ 
    private int _count; 
    private readonly Action _callback; 

    public ActionWaitHandler(int count, Action callback) 
    { 
     _count = count; 
     _callback = callback; 
    } 

    public void Signal() 
    { 
     _count--; 
     if (_count == 0) 
     { 
      _callback(); 
     } 
    } 
} 

उपयोग:

public void method() { 
    var handler = new ActionWaitHandler(2, OnActionsComplete); 

    _model.GetMyTypeList(list => 
    { 
     MyTypeList.AddRange(list); 
     handler .Signal(); 
    }); 

    _model.GetStigTypeList(list => 
    { 
     StigTypeList.AddRange(list); 
     handler .Signal(); 
    }); 
} 

public void OnActionsComplete() 
{ 
    dosomething; 
} 
+1

हाँ, अच्छी पकड़। ऐसा लगता है कि सिल्वरलाइट पर उपलब्ध नहीं है। – DanTheMan

9

हां, एक काउंटर है जो आपको चाहिए। एक काउंटर का उपयोग कर,

using (CountDownEvent countDownEvent = new CountDownEvent(2)) 
{ 
    _model.GetMyTypeList(list => 
    { 
     MyTypeList.AddRange(list); 
     countDownEvent.Signal(); 
    }); 

    _model.GetStigTypeList(list => 
    { 
     StigTypeList.AddRange(list); 
     countDownEvent.Signal(); 
    }); 

    countdownEvent.Wait(); 
    doSomethingNowThatWereComplete(); 
} 
+1

मुझे लगता है कि यह .NET 4 के साथ सही दृष्टिकोण है, लेकिन ऐसा लगता है कि क्लासलाइट के लिए कक्षा उपलब्ध नहीं है। – randoms