2013-01-10 14 views
7

मैं अंतराल प्रक्रियाओं की कतार लोड करने की कोशिश कर रहा हूं। दूसरे शब्दों में मेरे पास एक कतार है और मैं प्रत्येक आइटम को कतार में एक व्यक्तिगत अंतराल पर चलाने के लिए चाहता हूं।नेट अधिकतम समवर्ती टाइमर धागे

मेरी समस्या यह है कि मुझे एक समय में चलाने के लिए 25 से अधिक धागे नहीं मिलते हैं। मैं 64 बिट मशीन पर .NET 4.5 का उपयोग कर रहा हूं जिसमें 32768 की डिफ़ॉल्ट अधिकतम थ्रेड गिनती है।

मैं अपनी मशीन को संभाल सकता हूं क्योंकि मेरे ऐप को कई समवर्ती धागे कैसे चला सकते हैं?

class Program 
{ 
    static void Main(string[] args) 
    { 
     System.Threading.ThreadPool.SetMaxThreads(200, 200); 
     test t = new test(); 

     t.LoadUrls("http://www.google.com"); 

     while (1 == 1) 
     { 
      System.Threading.Thread.Sleep(1000);//refresh every 5 seconds 
      Console.WriteLine(System.Diagnostics.Process.GetCurrentProcess().Threads.Count); 
     } 
    } 


    public class test 
    { 

     public void LoadUrls(string url) 
     { 
      for (int i = 0; i < 100; i++) 
      { 
       System.Threading.Timer t = new System.Threading.Timer(new System.Threading.TimerCallback(RunInterval), url, 0, 1000); 
       Console.WriteLine("Loaded {0} feeds.", i); 
      } 
     } 
     private static void RunInterval(object state) 
     { 
      string url = state as string; 
      string data = ""; 

      using (System.Net.WebClient cl = new System.Net.WebClient()) 
      { 
       Console.WriteLine("getting data for " + url); 
       data = cl.DownloadString(url); 
      } 

      //do something with the data 

     } 
    } 
} 

इस कोड को सैद्धांतिक रूप से 2 सेकंड या तो के बाद 198 धागे चलाना चाहिए:

यहाँ कि मेरी उत्पादन कोड में वास्तविक समस्या replicates एक उदाहरण एप्लिकेशन है।

वैसे, यह मेरे प्रोटोटाइप ऐप में खूबसूरती से काम करता है; यह नोड में लिखा गया था। लेकिन, अब मैं इसे सही ढंग से सी # में काम करने के लिए नहीं मिल सकता है ...

उत्तर: समस्या कचरा संग्रहण के साथ वास्तव में था और एक ThreadPool मुद्दा बिल्कुल नहीं था, यह पूल उन सभी धागे को स्पूल करने में सक्षम है जो मैं इसे फेंक रहा हूं। यह चाल सिस्टम के एकल पैरामीटर कन्स्ट्रक्टर का उपयोग करना है। थ्रेडिंग। टिमर; यह टाइमर को स्वयं को सैमफोर के रूप में उपयोग करेगा, इस प्रकार जीसी से परहेज करेगा।

class Program 
{ 
    static void Main(string[] args) 
    { 
     for (int i = 0; i < 100; i++) 
     { 
      test t = new test(); 
      t.url = "http://www.google.com?" + i; 
      System.Threading.Timer ti = new System.Threading.Timer(new System.Threading.TimerCallback(t.RunInterval)); 
      ti.Change(0, 1000); 
     } 

     while (1 == 1) 
      System.Threading.Thread.Sleep(int.MaxValue); 
    } 


    public class test 
    { 
     public string url { get; set; } 
     public void RunInterval(object state) 
     { 
      Console.WriteLine("getting data for " + this.url); 
      string data = ""; 

      using (System.Net.WebClient cl = new System.Net.WebClient()) 
      { 
       data = cl.DownloadString(this.url); 
      } 
     } 
    } 
} 

मैं क्यों तुम कभी चाहेगा एक टाइमर जीसी द्वारा एकत्र किया जा करने के लिए सुनिश्चित करने के लिए नहीं कर रहा हूँ, लेकिन हे मैं जानता हूँ कि क्या करते हैं।

+1

में क्यों आप चाहते हैं तो कई सूत्र एक ही समय में चल रहे कार्य करें: यहाँ लिंक है? –

+0

यह एक मतदान सेवा के लिए है। इसे निर्दिष्ट अंतराल पर एन फीड्स को मतदान करना होगा। मैं एक फैंसी कतार प्रणाली बना सकता हूं और एन व्यक्तिगत सेवाओं को चला सकता हूं जो प्रति सेवा केवल 1 फीड मतदान करते हैं। लेकिन, मैं यह मेटा बनाना चाहता हूं; मैं कार्यक्रम को प्रत्येक व्यक्तिगत प्रक्रिया शुरू करना चाहता हूं। – Eulalie367

उत्तर

5

मेरी मशीन को संभालने के रूप में मैं अपने ऐप को कई समवर्ती धागे कैसे चला सकता हूं?

यह गलत दृष्टिकोण है। प्रत्येक धागा महंगा है, कुछ सौ बनाएं और आपका सिस्टम गंभीर रूप से खराब हो जाएगा।

आपका कोड थ्रेडपूल का उपयोग करता है। धागे की संख्या को सीमित करने के लिए पूल में एल्गोरिदम है। जब आप नींद() बार बढ़ाते हैं तो आप कुछ और धागे देख सकते हैं।

ThreadPool.MinThreads को सेट करने का एक और सीधा तरीका होगा। लेकिन कम प्रदर्शन की उम्मीद है, और अधिक नहीं।

+0

यह महंगा नहीं है ... मेरे पास 64 जीबी रैम काम करने के लिए है, लेकिन यह कभी 10 एमबी से अधिक नहीं हो जाता है।मैं इसे सभी 64 जीबी का उपयोग करना चाहता हूं। आपका सुझाव क्या होगा? – Eulalie367

+0

इसके अलावा, यह मेरे उपलब्ध CPU का 1% से अधिक कभी भी उपयोग नहीं करता है। – Eulalie367

+0

मैंने कुछ सुझाव जोड़े हैं लेकिन यह अभी भी गलत दृष्टिकोण है। –

1

आप मैक्सडेग्री ओफपेरेलिज्म नामक संपत्ति का उपयोग करना चाहते हैं, लेकिन आपको अपने कोड को थोड़ा सा संशोधित करने की आवश्यकता होगी। और फिर इसका परीक्षण करें और समानांतर में चलने वाले थ्रेड की इष्टतम संख्या को समझें। http://msdn.microsoft.com/en-us/library/system.threading.tasks.paralleloptions.maxdegreeofparallelism.aspx

+0

मैक्सडेग्री एक छत लगाता है। न्यूनतम नहीं –

2

अनुसार System.Threading.Timer

Use a TimerCallback delegate to specify the method you want the Timer to execute. The timer delegate is specified when the timer is constructed, and cannot be changed. The method does not execute on the thread that created the timer; it executes on a ThreadPool thread supplied by the system.

को फिर System.Threading.Threadpool

There is one thread pool per process. Beginning with the .NET Framework 4, the default size of the thread pool for a process depends on several factors, such as the size of the virtual address space. A process can call the GetMaxThreads method to determine the number of threads. The number of threads in the thread pool can be changed by using the SetMaxThreads method. Each thread uses the default stack size and runs at the default priority.

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