2010-05-05 24 views
12

मैं एक भारी एसिंक्रोनस एप्लिकेशन लिखता हूं।क्यूइंग विधि कॉल - कोई विचार कैसे?

मैं क्विकइवोक/एंडइवोक क्या करता है, वैसे ही विधि कॉल कतार करने का एक तरीका ढूंढ रहा हूं .... लेकिन मेरी ओवीएन कतार पर। रेक्सन यह है कि मेरे पास थ्रेडपूल का उपयोग करके अपना स्वयं का अनुकूलित संदेश क्यूइंग सिस्टम है, लेकिन साथ ही यह सुनिश्चित करना कि प्रत्येक घटक अनुरोधों में थ्रेडेड है (यानी एक धागा केवल एक घटक के लिए संदेशों को संभालता है)।

मेरे पास बहुत सारे संदेश आगे और आगे जा रहे हैं। सीमित उपयोग के लिए, मैं वास्तव में बहुत से प्रवेश करने वाले कॉल करने के लिए अपने स्वयं के पैरामीटर, विधि रैपिंग/अनैपिंग को परिभाषित करने के बजाय पैरामीटर के साथ एक संदेश कॉल कतार में सक्षम होना पसंद करूंगा। मैं हमेशा कतार को बाईपास नहीं करना चाहता हूं, और मैं निश्चित रूप से नहीं भेजना चाहता हूं कि भेजने की सेवा दूसरी सेवा के जवाब देने के लिए प्रतीक्षा करे।

कोई भी विधि कॉल को रोकने के तरीके के बारे में जानता है? इसके लिए TransparentProxy/वर्चुअल प्रॉक्सी का उपयोग करने का कोई तरीका? ;) ServicedComponent? मैं इसे जितना संभव हो उतना ऊंचा ओवरहेड करना चाहता हूं;)

उत्तर

13

लैम्बडास का उपयोग करने के बारे में कैसे?

मेरा मतलब है, तुम क्यों कुछ कतार न बनाएं, और जैसे

while (!queue.Empty) 
{ 
    Action action = queue.Pop(); 
    action(); // this calls your action 
} 

ढंग से उन्हें प्रोसेस तुम बहुत बस कार्यों जोड़ सकते हैं:

Queue.Add(()=>{ /* any code you wish here */}) 

यह सिर्फ एक टिप है, मैं मुझे यकीन नहीं है कि कुछ कतार वर्ग है, लेकिन यह आपके द्वारा एक (और थ्रेडसेफ!) बनाने के लिए बहुत सरल होना चाहिए।

कामकाज बहुत बुद्धिमान हो सकता है (और चाहिए), लेकिन मुख्य बिंदु वहां है। अगर आप परामर्श करना चाहते हैं तो मुझे लिखें।

Pz, TaskConnect डेवलपर

+0

TGhe कतार समस्या नहीं है;) मेरे पास है कि पहले से ही एक है, और एक डेटा अपडेट परिवहन करने वाले बहुत सारे संदेश। मेरी समस्या केवल फ़ंक्शन कॉल हैं। कतार तब एक थ्रेडपूल का उपयोग करता है जो एक कार्यकर्ता धागा प्राप्त करता है जो इसकी सामग्री को संसाधित करता है;) मेरे पास बहुत सी क्रॉस प्रोसेस डेटा अपडेट स्टफ है - अब मैं कतार (प्रक्रिया में) विधि कॉल करने का एक तरीका ढूंढता हूं। एक संदेश प्रकार जिसमें "डेटा" नहीं है लेकिन सभी पैरामीटर के साथ फ़ंक्शन कॉल है, इसलिए मैं लक्ष्य सेवा पर मूलभूत कॉल विधियां कर सकता हूं। इससे मुझे आवश्यक विभिन्न संदेशों की संख्या में काफी कमी आएगी ... – TomTom

+0

और मुझे अलग-अलग तरीकों को कॉल करने के लिए सिर्फ एक ह्यू स्विच स्टेटमेंट के साथ नहीं आना पड़ेगा। – TomTom

+0

चूंकि आप इन-प्रोसेस विधि कॉल कतार में दिख रहे हैं, इसलिए लैम्बडास पास करना ठीक वही लगता है जो आप ढूंढ रहे हैं ... –

1

DynamicProxy कि महल परियोजना का हिस्सा है ठेठ मार्शलिंग दर्द से कुछ के बिना वस्तु सदस्य अवरोधन की अनुमति देता है

http://www.castleproject.org/projects/dynamicproxy/

आप इस का उपयोग कर सकता है अपने तरीके रोकना कॉल करें और फिर उनसे करें जो आप चाहते हैं।

2

बाद MethodInvoker के

Queue<MethodInvoker> EventCall = new Queue<MethodInvoker>(); 

की एक कतार बनाएं अपनी क़तार

EventCall.Enqueue(ClearAllVals); 
EventCall.Enqueue(saystuff); 
EventCall.Enqueue(testFunc); 

तब में आइटम जोड़ने के लिए एक समय में अपने कार्यों से एक फोन:

MethodInvoker bb = EventCall.Dequeue(); 
bb(); 
bb = EventCall.Dequeue(); 
bb(); 
bb = EventCall.Dequeue(); 
bb(); 

के सभी कॉल करने के लिए अपने एक सुरक्षित तरीके से कार्य करता है (इससे उन्हें कतार खाली और सभी फ़ंक्शन को छोड़कर कतार से भी हटा दिया जाएगा कहा जाता रहा है)

public bool InvokeAll(){ 
    MethodInvoker bb = null; // this will hold the function prior to use 
    for(int i = 0; i<EventCall.count; i++){ 

     bb = EventCall.Dequeue(); //pull a method off of the queue 
     bb(); //call the method you pulled off of the queue 

    } 
} 

उन सब को कॉल करने के लिए सिर्फ InvokeAll(); का उपयोग करें या उन्हें एक एक समय जब चाहें तब कॉल करने के लिए:

public bool NextEvent(){ 
    MethodInvoker bb = null; // this will hold the function prior to use 
    if(EventCall.count > 0){ 

     bb = EventCall.Dequeue(); //pull a method off of the queue 
     bb(); //call the method you pulled off of the queue 

     } else { 
     MessageBox.Show("there was no event to call"); // this is optional, point being you should be handeling the fact that there is no events left in some way. 
     } 
} 
संबंधित मुद्दे