असिंक्रोनस प्रतिनिधि (कॉलबैक) के साथ थ्रेड (थ्रेडपूल थ्रेड नहीं) को बदलना।एसिंक्रोनस प्रतिनिधि बनाम थ्रेड
मेरा परिदृश्य: एक थ्रेड/del.beginInvoke() प्रति ग्राहक स्पॉन करें।
मेरे अनुसार,
कारण
- कॉलबैक/कॉल प्रतिनिधि के माध्यम से अधिसूचना के लिए फिर से जरूरत कॉलबैक में
- बचें थ्रेड ओवरहेड, (प्रतिनिधियों ThreadPool धागे का उपयोग करें)
- पासिंग तर्क (बचें ऑब्जेक्ट कास्टिंग) और विधि से वापसी मूल्य की आवश्यकता है।
यदि ऊपर दिए गए कारण गलत हैं तो मुझे सही करें।
- क्या कोई अन्य कारण है?
- असिंक्रोनस डेलीगेट्स के साथ मुझे कुछ सामान करने की ज़रूरत है कि धागे नहीं कर सकते हैं?
3. प्रदर्शन?
उदाहरण
public delegate void SendCallbackType();
SendCallbackType senderdel= new SendCallbackType(SendData);
public void StartSend() // This method Could be Called more than 700 times (Thread per Client)
{
senderdel.BeginInvoke(SendCallback,null);
// (or)
Thread t = new Thread(new ThreadStart(ThreadSend));
t.IsBackground = true;
t.Start();
}
//Async Delegate
void SendData()
{
string data = QueData.DeQueue();
RaiseOnData(data); // Raise to event.
}
void SendCallback(IAsyncResult ar)
{
senderdel.BeginInvoke(SendCallback, null);
}
//Thread
void ThreadSend()
{
while (true)
{
string data = QueData.DeQueue();
RaiseOnData(data); // Raise to event.
}
}
ऊपर कौन सा विकल्प सबसे अच्छा होगा से। प्रदर्शन ?
@ डारिन: उत्तर के लिए धन्यवाद।यहां मामला विंडोज़ एप्लीकेशन है, मुझे लगता है कि पूरी तरह से सीपीयू गहन कार्य, 1000 धागे बनाम 1000 del.begininvoke() कॉल –
@MSK पर प्रदर्शन के दौरान प्रदर्शन के बारे में क्या है, निश्चित रूप से इस मामले में टीपीएल के साथ जाएं और यदि आप पुराने संस्करण का उपयोग कर रहे हैं। नेट थ्रेड पूल (थ्रेडपूल, पृष्ठभूमिवर्कर, असिंक प्रतिनिधि, ... => का उपयोग करते हैं, वे सभी थ्रेडपूल पर वैसे भी समाप्त हो जाएंगे)। इस स्थिति में मैन्युअल रूप से धागे को मत बढ़ाओ। –
@ डारिन: और मुझे आग की जरूरत नहीं है और भूल जाओ। यहां मुझे डेक्यू (थ्रेडपूल के बावजूद) के लिए समर्पित थ्रेड की आवश्यकता है और साथ ही यह लंबी चल रही प्रक्रिया है। –