2012-12-26 12 views
5

मैं लगता है:घटनाओं और सूत्रण

ethernet_adapter.PacketArrived += (s, e) => 
{ 
    //long processing... 
}; 

प्रसंस्करण एक लंबा समय लग सकता है और जब तक यह बीच में था एक और पैकेट आ गया है। आगे क्या होता है: प्रसंस्करण हो जाता है और फिर एक और घटना निकाल दी जाती है या शायद नई घटना तुरंत निकाल दी जाती है लेकिन एक नए धागे पर?

+0

'ethernet_adapter' किस प्रकार का ऑब्जेक्ट है? –

+0

@JimMischel यह एक तृतीय पक्ष लाइब्रेरी प्रकार 'ICaptureDevice' है। मुझे लगता है मुझे जवाब मिला। – ren

उत्तर

2

आपको नहीं मानना ​​चाहिए। इस प्रकार के आधार पर यह कुछ भी हो सकता है कि कैसे प्रकार (ethernet_adapter ऑब्जेक्ट) द्वारा उठाया जाता है।

यदि यह सिंक्रोनस ऑपरेशन है, तो नया ऑपरेशन तब तक नहीं उठाया जाएगा जब तक कि वर्तमान ऑपरेशन प्रगति पर न हो।

यदि यह असीमित ऑपरेशन है, तो नई घटना तुरंत उठाई जाएगी।

protected virtual void OnPacketArrived(PacketArrivedEventArgs e) 
{ 
    EventHandler<PacketArrivedEventArgs> handler = this.PacketArrived; 

    if (handler != null) 
    { 
     handler(this, e); 
    } 
} 

(अपने उदाहरण के रूप में) इतने लंबे समय के प्रसंस्करण तुल्यकालिक ग्राहक सभी ग्राहकों पर आंतरिक गणना को ब्लॉक कर देगा:

2

संभावना है कि यह एक तुल्यकालिक ऑपरेशन है। एक और धागे पर होने वाला एकमात्र तरीका यह है कि अगर वस्तु उत्पन्न होती है तो यह एक और धागे पर होता है, या यदि आप हैंडलर में करते हैं। ऐसा करने के कई तरीके हैं, लेकिन System.Threading.Tasks.Task का उपयोग करते समय सामान्य रूप से प्राथमिकता दी जाएगी यदि .NET 4.

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

0

आप थ्रेडपूल में पूरे कार्य को अनुवर्ती कर सकते हैं।

ethernet_adapter.PacketArrived += (s, e) => 
{ 
ThreadPool.QueueUserWorkItem("long processing item"); 
}; 

या आप प्रत्येक थ्रेड के लिए कार्य (.net 4.0) बना सकते हैं।

+0

यह ओपी प्रश्न से कैसे संबंधित है? – Tilak

+0

प्रत्येक लंबी प्रोसेसिंग आइटम थ्रेडपूल में कतार हो सकती है और तदनुसार परोसा जाएगा। मुझे उम्मीद है कि मुझे समस्या समझा है। – paritosh

+0

मुझे लगता है, सवाल यह है कि, "व्यवहार क्या है" और नहीं "एसिंक हैंडलिंग कैसे करें" – Tilak

0

माना जाता है आपकी ethernet_adapter कक्षा में एक विधि है। परंतु! यह OnPacketArrived पर बाद की कॉल को अवरुद्ध नहीं कर सकता है यदि ethernet_adapter इसे हर बार एक अलग थ्रेड पर आमंत्रित करता है - तो आपको दो समवर्ती लंबी प्रसंस्करण मिल जाएगी, और इसी तरह। अलग हर बार है जबकि वहाँ आईओ ThreadPool में किसी भी - यह async तरीकों के कारण पूरा होने कॉलबैक IOCP धागे पर लागू किया जा रहा है:

उदाहरण के लिए, Socket कार्यान्वयन पर एक नजर है।

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