2011-12-21 22 views
5

मेरा प्रोग्राम कुछ कार्यों के लिए कुछ धागे बनाता है।प्रबंधित थ्रेड आईडी अद्वितीय नहीं है?

मेरे कोड इस तरह है:

Dictionary<int, double> threadStates = new Dictionary<int, double>(); 
for (int i = 0; i < SubNNs.Count(); i++) 
{ 
    Thread tt = new Thread(StartTrainingSubs); 
    threadStates.Add(tt.ManagedThreadId, 0); 
    tt.Priority = ThreadPriority.Highest; 
    tt.Start(i); 
} 

लेकिन कभी कभी, अगर SubNNs.Count() बड़ा हो जाता है (10-20), कार्यक्रम इस अपवाद फेंकता है: "। एक ही कुंजी पहले से ही जोड़ दिया गया है के साथ एक आइटम" लाइन threadStates.Add(tt.ManagedThreadId, 0);

मैं यह त्रुटि क्यों दे रहा हूं? ManagedThreadId अद्वितीय नहीं है? यदि हां, तो मुझे क्या करना चाहिए?

और यदि नहीं, तो शायद एक धागा खत्म हो जाता है और दूसरा धागा उसी ManagedThreadId से शुरू होता है? क्या यह संभव है? इस समस्या को कैसे रोकें?

या कोई और समस्या है?

संपादित करें: उपयोगकर्ताओं ने कहा कि प्रबंधित थ्रेड आईडी का पुन: उपयोग किया जा सकता है। इसलिए, चूंकि कोड के बाद के हिस्सों में, प्रत्येक धागे को खुद को एक अद्वितीय संख्या के साथ जानना आवश्यक है, क्या थ्रेड के नाम की तरह कुछ जोड़ने का कोई तरीका है कि प्रत्येक थ्रेड को इसकी अनूठी संख्या मिल सकती है?

किसी भी सलाह के लिए धन्यवाद!

+3

हां, थ्रेड आईडी रीसाइक्लिंग हो जाते हैं। –

उत्तर

6

यदि नहीं, तो शायद एक धागा खत्म हो जाता है और दूसरा थ्रेड उसी प्रबंधित प्रबंधित थ्रेड के साथ शुरू होता है? क्या यह संभव है? इस समस्या को कैसे रोकें?

हां। प्रबंधित थ्रेड आईडी का पुन: उपयोग किया जा सकता है। वे एक शब्दकोश राज्य कुंजी के लिए एक अच्छा विकल्प नहीं हैं।

राज्य को ट्रैक करने के लिए थ्रेड आईडी का उपयोग करने के बजाय, आपको कुछ अन्य अद्वितीय मूल्यों का उपयोग करने पर विचार करना चाहिए। आपके मामले में, "i" अद्वितीय प्रति लूप है - इसे अपनी कुंजी के रूप में क्यों न उपयोग करें?

+0

धन्यवाद। "मैं" अद्वितीय है, यह सही है। लेकिन कोड के दूसरे भाग में, प्रत्येक थ्रेड को खुद को जानना आवश्यक है, हर धागा इसके प्रबंधित थ्रेड आईडी को जानता है, लेकिन "i" के बारे में नहीं। –

+0

क्या मैं प्रत्येक धागे के नाम की तरह कुछ सेट कर सकता हूं? तो, हर धागा खुद को पहचान सकता है? –

+1

@Mahdi आपको थ्रेड आईडी के लिए क्या चाहिए? आप जानकारी को थ्रेड की शुरुआत में पास कर सकते हैं - अब आप यह कर रहे हैं ('tt.Start (i);') बस आपको आवश्यक राज्य पास करें। यदि आपको एक अद्वितीय पहचानकर्ता की आवश्यकता है, तो पैरामीटरेटेड थ्रेडस्टार्ट दिनचर्या में सीधे एक को पास करें। –

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