2008-10-10 6 views
6

मेरे पास एक .NET एप्लिकेशन है जो बैच आयात में लगभग 300,000 रिकॉर्ड संसाधित करता है, और इसमें प्रति सेकंड कुछ सेकंड लगते हैं, इसलिए मैं इसे समानांतर करना चाहता हूं। निम्नलिखित कोड में, ProcessWithAnsycDelegates() और ProcessWithThreadPool() के बीच क्या अंतर है?भारी समांतरता के लिए एसिंक्रोनस प्रतिनिधि या थ्रेडपूल। क्यूयूयूसर वर्कइटम का उपयोग करें?

public class ResultNotification 
{ public EventHandler event Success; 
    public EventHandler event Fail; 
    internal void Notify(bool sucess) {if (success) Success(); else Fail();} 
} 

public static class Processor 
{ public ResultNotification ProcessWithAnsycDelegates(Record record) 
    { var r = new ResultNotification(); 
     Func<Record,bool> processRecord=new RecordProcessor().ProcessRecord; 
     processRecord.BeginInvoke 
        (record 
         ,ar => result.Notify(processRecord.EndInvoke(ar)) 
         ,null); 
     return r;  
    } 

    public ResultNotification ProcessWithThreadPool(Record r) 
    { var r = new ResultNotification(); 
     var rp = new RecordProcessor(); 
     ThreadPool.QueueWorkUserItem(_=>result.Notify(rp.ProcessRecord(r))); 
     return r; 
    } 
} 

उत्तर

6

इस मामले में, वे दोनों हुड के नीचे थ्रेडपूल का उपयोग नहीं करते हैं। मैं कहूंगा कि QueueUserWorkItem() को पढ़ने और देखने के लिए आसान है बनाम BeginInvoke पर क्या चल रहा है।

यह लिंक मदद कर सकता है। यह पुरानी जानकारी है, लेकिन अभी भी अधिकतर लागू http://www.yoda.arachsys.com/csharp/threads/threadpool.shtml

+0

कौन सा भागों लागू नहीं कर रहे हैं? – bzlm

7

प्रश्न का शाब्दिक उत्तर यह है कि दोनों थ्रेडपूल का उपयोग करते हैं, इसलिए प्रदर्शन केवल एकमात्र विचार है तो अंतर बहुत अधिक नहीं है।

यदि प्रश्न वास्तव में सर्वश्रेष्ठ प्रदर्शन प्राप्त करने के बारे में है, तो यह जानने में मदद मिल सकती है कि थ्रेडपूल का उपयोग करने में समस्याएं हैं। इनमें शामिल हैं: काम कतार

  • अत्यधिक संदर्भ स्विचिंग पर

    • लॉक विवाद। यदि आपके पास 2 सीपीयू और कार्य आइटमों का अनुक्रम है तो 25 धागे वास्तव में मदद नहीं करते हैं। बेहतर 2 सूत्र, प्रत्येक सीपीयू के लिए एक

    यह जांच कर रही लायक हो सकता है TPL और PLINQ के लिए:

    एक उदाहरण वे उपयोग में टीपीएल देना है:

    for (int i = 0; i < 100; i++) { 
        a[i] = a[i]*a[i]; 
    } 
    
    को

    :

    Parallel.For(0, 100, delegate(int i) { 
        a[i] = a[i]*a[i]; 
    }); 
    
  • संबंधित मुद्दे