मैंने एक प्रोग्राम लिखा है जो Parallel.ForEach
का उपयोग कर सभी उपलब्ध कोर का उपयोग करता है। ForEach
की सूची में ~ 1000 ऑब्जेक्ट्स हैं और प्रत्येक ऑब्जेक्ट के लिए गणना कुछ समय (~ 10 सेकंड) लेती है। इस परिदृश्य मैं सेटअप में इस तरह एक टाइमर:System.Timers.Timer बड़े पैमाने पर गलत
timer = new System.Timers.Timer();
timer.Elapsed += TimerHandler;
timer.Interval = 15000;
timer.Enabled = true;
private void TimerHandler(object source, ElapsedEventArgs e)
{
Console.WriteLine(DateTime.Now + ": Timer fired");
}
पल TimerHandler
विधि पर यकीन है कि समस्या इस विधि के कारण नहीं है बनाने के लिए एक ठूंठ है।
मेरी उम्मीद थी कि TimerHandler
विधि प्रत्येक ~ 15 सेकंड निष्पादित की जाएगी। हालांकि, इस विधि के लिए दो कॉल के बीच का समय भी 40 सेकंड तक पहुंचता है, इसलिए 25 सेकंड बहुत अधिक होते हैं। विधि के लिए new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount -1 }
का उपयोग करके यह नहीं होता है और 15 सेकंड की अपेक्षित अंतराल देखी जाती है।
क्या इसका इरादा है कि मुझे यह सुनिश्चित करना होगा कि प्रति सक्रिय टाइमर हमेशा एक कोर उपलब्ध हो? लगता है कि थोड़ा और अजीब लगता है, क्योंकि "आरक्षित" मेरी गणना के लिए एक मूल्यवान संसाधन हो सकता है।
संपादित करें: जैसा कि युगल द्वारा इंगित किया गया है कि ThreadPool.SetMinThreads
द्वारा पूल में निश्चित न्यूनतम धागे को समस्या हल हो गई है। मैंने Parallel.ForEach
विधि के लिए new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }
(इसलिए -1
प्रारंभिक प्रश्न में) की कोशिश की और यह समस्या हल करती है। हालांकि, मेरे पास कोई अच्छी व्याख्या नहीं है कि इन संशोधनों ने समस्या का समाधान क्यों किया। हो सकता है कि इतने सारे थ्रेड बनाए गए कि टाइमर थ्रेड को "लंबे समय तक" खो दिया गया जब तक कि इसे फिर से निष्पादित नहीं किया गया।
यदि आप समांतर लूप निष्पादित करने से पहले थ्रेड-पूल में धागे की संख्या को स्पष्ट रूप से सेट करते हैं, तो क्या यह अभी भी होता है? ('ThreadPool.SetMinThreads' का उपयोग करके) –
क्या आप सभी प्रोसेसर का उपयोग करते समय प्रोसेसर उपयोग को घुमा रहे हैं? यदि हां, तो सभी घटनाएं संदेश पंप को कैसे संसाधित करती हैं, इस वजह से सभी घटनाएं धीमी प्रतिक्रिया देगी। – Jeremy
मुझे लगता है कि थ्रेड समानांतर धागे चल रहा है (जो शायद टाइमर चलाने वाला एक ही धागा है) खुद को अवरुद्ध कर रहा है। यदि आप अपने टाइमर को एक अलग थ्रेड पर चलाने का कोई तरीका ढूंढ सकते हैं, तो आपकी समस्या दूर हो सकती है। आपके टाइमर को चलाने वाला थ्रेड अलग-अलग हो सकता है कि आपके ऐप को होस्ट किया गया है btw (उदा। विंडोज फॉर्म बनाम कंसोल ऐप) –