2013-07-29 4 views
13

मेरे पास कुछ निश्चित घटनाएं हैं जिन्हें किसी विशिष्ट थ्रेड पर फ़ंक्शन ट्रिगर करना चाहिए, जो कि कुछ कोड के माध्यम से लूपिंग है।मेरे csharp एप्लिकेशन में फ़ंक्शंस का संग्रह

अब, इस डेटा को हाथ से संग्रहित करने और एक बड़ा स्विच-केस रखने के बजाय मैं सोच रहा था कि क्या इन कार्यों और उनके paramteres को एक सूची में स्टोर करना संभव है, जिसे बाद में अन्य धागे द्वारा संसाधित किया जाता है?

छद्म कोड:

var func = pointer2somefunction(13, "abc"); 
list.add(func); 

अन्य धागा:

while (list.Count > 0) 
{ 
    var func = list.Remove(0); 
    func.Invoke(); 
} 
+6

आप [प्रतिनिधियों] (http://msdn.microsoft.com/en-us/library/ms173172.aspx) का उपयोग कर सकते हैं, जो फ़ंक्शन पॉइंटर्स का सी # संस्करण है। –

+0

आप जिस भी विधि का उपयोग करते हैं, यह सुनिश्चित करने के लिए कि आप थ्रेड के बीच सिंक्रनाइज़ेशन समस्याएं प्राप्त नहीं करते हैं, सुनिश्चित करें कि आप थ्रेड-सुरक्षित 'सूची' का उपयोग करें। –

उत्तर

18

हाँ, तो आप इस एक List<Action> या एक Queue<Action> जो मेरी राय में थोड़ा बेहतर सूट का उपयोग करके कर सकते हैं।

var functions = new Queue<Action>(); 

functions.Enqueue(() => Console.WriteLine("Foo")); 
functions.Enqueue(() => Console.WriteLine("Bar")); 

while (functions.Any()) 
{ 
    // note the double parenthesis here: one for Dequeue 
    // and one for your dequeued function 
    functions.Dequeue()(); 
} 

आप मानकों की जरूरत है, दो और इसके आगे के लिए एक के लिए Action<T>, Action<T, T> का उपयोग करें: Action नो पैरामीटर शून्य प्रतिनिधि के लिए एक प्रकार है। वापसी मूल्य के लिए, Action (या Func<T> इत्यादि) के बजाय Func का उपयोग करें।

शायद ईवेंट आपकी भी मदद करेगा। घटनाक्रम पर्यवेक्षक पैटर्न का उपयोग करने के लिए सी # की भाषा सुविधा है।

// events are usually on the instance rather than static 
private static event EventHandler MyEvent; 

static void Main(string[] args) 
{ 
    MyEvent += (s, e) => Console.WriteLine("FooEvent"); 
    MyEvent += (s, e) => Console.WriteLine("BarEvent"); 
    MyEvent(null, EventArgs.Empty); 
} 

एक घटना एक बहुस्त्र्पीय प्रतिनिधि, जो कार्यों के सूची के लिए एक प्रतिनिधि है। आप प्रत्येक हैंडलर के लिए थ्रेडिंग को नियंत्रित नहीं कर सकते हैं: ऊपर Queue<Action> के विपरीत, जहां आप धागे को शुरू या पुन: उपयोग कर सकते हैं, एक मल्टीकास्ट प्रतिनिधि को के रूप में उजागर किया जाता है, एक कॉल बाहर से कॉल करता है, जिससे आप सभी आमंत्रणों के लिए केवल एक थ्रेड का उपयोग कर सकते हैं।

+4

@clamp ध्यान दें कि ['एक्शन'] (http://msdn.microsoft.com/en-us/library/system.action.aspx) किसी फ़ंक्शन के लिए केवल एक पूर्वनिर्धारित प्रकार है जिसमें कोई पैरामीटर नहीं है और कोई वापसी मूल्य नहीं है। यदि आप फ़ंक्शंस लेना चाहते हैं या कुछ वापस करना चाहते हैं, तो आप अभी भी ऐसा कर सकते हैं, प्रकार हस्ताक्षर थोड़ा लंबा होगा। –

1

मुझे लगता है कि आप इस तरह से घटनाओं को कार्यान्वित कर रहे हैं। आपको एक बड़े स्विच केस की आवश्यकता नहीं है, आपको कई घटनाओं की आवश्यकता है, और फिर सही समय पर सही घटना को ट्रिगर करें, और इसे सही विधि से पंजीकृत करें।

आप प्रतिनिधियों की एक सूची कर सकते हैं, लेकिन जब आप विभिन्न पैरामीटर के साथ अलग-अलग फ़ंक्शन चाहते हैं तो यह जटिल हो जाएगा।

संबंधित मुद्दे