2011-03-08 17 views
6

जब मैं नीचे कोड लिखता हूं, तो मुझे 1022, 1020 जैसे उपलब्ध थ्रेड नंबर क्यों मिलता है। मुझे 25 थ्रेड अधिकतम प्राप्त करना है क्योंकि मैं थ्रेड पूल का उपयोग कर रहा हूं।थ्रेड पूल में सक्रिय थ्रेड संख्या

मुझे लगता है कि आउटपुट थ्रेड नंबर सिस्टम पर उपलब्ध थ्रेड है। मुझे जीत फॉर्म आवेदन में, मेरे थ्रेड पूल में उपलब्ध थ्रेड नंबर प्राप्त करने की आवश्यकता है।

private void Foo() 
{ 
    int intAvailableThreads, intAvailableIoAsynThreds; 

    // ask the number of avaialbe threads on the pool, 
    //we really only care about the first parameter. 
    ThreadPool.GetAvailableThreads(out intAvailableThreads, 
     out intAvailableIoAsynThreds); 

    // build a message to log 
    string strMessage = 
     String.Format(@"Is Thread Pool: {1}, 
      Thread Id: {2} Free Threads {3}", 
      Thread.CurrentThread.IsThreadPoolThread.ToString(), 
      Thread.CurrentThread.GetHashCode(), 
      intAvailableThreads); 

    // check if the thread is on the thread pool. 
    Trace.WriteLine(strMessage); 

    // create a delay... 
    Thread.Sleep(30000); 

    return; 
} 

धन्यवाद बहुत ..

(नोट: मैं http://www.codeproject.com/KB/cs/AsyncMethodInvocation.aspx से कोड मिल गया) अच्छा लेख !!

+1

इसमें कोई संदेह नहीं है कि लेख उत्कृष्ट है, लेकिन यह 2006 में लिखा गया है! – Azmeer

उत्तर

8

मुझे 25 थ्रेड अधिकतम प्राप्त करना है क्योंकि मैं थ्रेड पूल का उपयोग कर रहा हूं।

थ्रेड-पूल प्रति कोर में धागे की संख्या काफी समय से बदल गई है। यह 25 प्रति कोर नहीं है, जो मुझे संदेह है कि आप क्या उम्मीद कर रहे थे।

उदाहरण के लिए, .NET 4 के साथ मेरी क्वाड-कोर hyperthreaded लैपटॉप पर इस चल रहा है, मैं 32767 कार्यकर्ता धागे और 1000 आईओ पूरा होने के बंदरगाह धागे:

using System; 
using System.Threading; 

class Test 
{ 
    static void Main() 
    { 
     int worker; 
     int ioCompletion; 
     ThreadPool.GetMaxThreads(out worker, out ioCompletion); 
     Console.WriteLine("{0}/{1}", worker, ioCompletion); 
    }  
} 

.NET 3.5 के तहत मैंने 2000 कार्यकर्ता धागे हो और अभी भी 1000 आईओ पूरा पोर्ट बंदरगाह।

+0

मैंने थ्रेड सेट किया है। मेटमैक्स 10001 पर थ्रेड करें, उसके बाद भी, जब भी मैं आपका प्रोग्राम चलाता हूं तो यह अधिकतम थ्रेड 10001 दिखाता है, यह लगातार रहता है। मैंने अपने कोर i 5 सिस्टम को पुनरारंभ नहीं किया। क्या यह आपके सिस्टम पर संभव है कुछ प्रक्रियाओं ने इसे आपके द्वारा दी गई संख्याओं पर सेट किया है? –

+0

मुझे आश्चर्य है कि आपको एफडब्ल्यू 3.5 में 2000 कार्यकर्ता धागे कैसे मिले, जबकि यह 250 प्रति कोर (fw3.5 में) होने का अनुमान है - तो क्वाड = 4 जिसका अर्थ है 4 * 250 = 1000. (इसलिए यह बहुत अजीब है कि आपको 2000 मिल गया है) ..... (mmm शायद हाइपरथ्रेडेड चीज़?) –

4

आप जो चाहते हैं उसे प्राप्त करने के लिए ThreadPool.GetMaxThreads का उपयोग करें।

This articleThreadPool के बारे में जानने के लिए आपको जो कुछ भी जानने की आवश्यकता है उसे समझाने में मदद करता है।

+0

ऐसा लगता है कि आप घोड़े को पानी में ले जा सकते हैं लेकिन कभी-कभी आपको इसे कॉपी और पेस्ट करना भी होता है ... – Rory

+1

@Rory, या, ऐसा लगता है जवाब सिर्फ एक लिंक है, और इसके बजाय एक टिप्पणी होना चाहिए। – gdoron

-1
int available; 
int maxLimit; 
System.Threading.ThreadPool.GetAvailableThreads(out available, out maxLimit); 
+1

इस फ़ंक्शन में उपलब्ध थ्रेड उपलब्ध है, लेकिन maxLimit उपलब्ध समापन बंदरगाह है। MaxLimit को खोजने के लिए आपको GetMaxThreads को कॉल करने की आवश्यकता है। –

1

मैं थ्रेडपूल.SetMaxThread का उपयोग करके 10001 पर सेट करता हूं। उसके बाद, जब भी मैं आपका प्रोग्राम चलाता हूं तो यह अधिकतम थ्रेड 10001 दिखाता है, यह लगातार रहता है। मैंने अपने कोर i 5 सिस्टम को पुनरारंभ नहीं किया।

उसके बाद मैं सेट दोनों इसे 10000000 करने के लिए, और यह धागा अधिकतम गिनती निम्नलिखित दिख रहा है

कार्यकर्ता: 32767 ioCompletion: 32767

मेरी विंडोज 7 इंटेल कोर i5 पर

तो, यह अधिकतम क्षमता है।

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