2012-10-27 10 views
5

GetCurrentThreadId() को बहिष्कृत कर दिया गया है, और एमएसडीएन ने प्रबंधित किया है ManagedThreadId इसे बदल देता है।AppDomain.GetCurrentThreadId को बदलना(); ManagedThreadId

हालांकि, मुझे अलग-अलग परिणाम मिल रहे हैं, और बाद वाले मेरे कोड में अपवाद का कारण बनता है। मेरा कोड this post से अनुकूलित किया गया है।

 public static void SetThreadProcessorAffinity(params byte[] cpus) 
     { 
      if (cpus == null) 
      { 
       throw new ArgumentNullException("cpus"); 
      } 

      if (cpus.Length == 0) 
      { 
       throw new ArgumentException(@"You must specify at least one CPU.", "cpus"); 
      } 

      // Supports up to 64 processors 
      long cpuMask = 0; 
      byte max = (byte)Math.Min(Environment.ProcessorCount, 64); 

      foreach (byte cpu in cpus) 
      { 
       if (cpu >= max) 
       { 
        throw new ArgumentException(@"Invalid CPU number."); 
       } 

       cpuMask |= 1L << cpu; 
      } 

      // Ensure managed thread is linked to OS thread; does nothing on default host in current .NET versions 
      Thread.BeginThreadAffinity(); 

#pragma warning disable 618 
      // The call to BeginThreadAffinity guarantees stable results for GetCurrentThreadId, 
      // so we ignore the obsolete warning. 
      int osThreadId = AppDomain.GetCurrentThreadId(); 
      osThreadId = Thread.CurrentThread.ManagedThreadId;// NOT THE SAME VALUE 
#pragma warning restore 618 

      // Find the ProcessThread for this thread 
      ProcessThread thread = Process.GetCurrentProcess().Threads.Cast<ProcessThread>() 
       .Where(t => t.Id == osThreadId).Single(); 

      // Set the thread's processor affinity 
      thread.ProcessorAffinity = new IntPtr(cpuMask); 
     } 

मैं समस्या देख सकता हूं कि किसी को थ्रेड की प्रक्रिया आईडी मिलती है जबकि दूसरे को ऐप की प्रक्रिया आईडी मिलती है।

मैं इसे बहिष्कृत विधि के बिना काम करने के लिए कैसे प्राप्त करूं? मूल स्टैक   ओवरफ़्लो आलेख P/Invoke का उपयोग करने के लिए कहता है, लेकिन मुझे नहीं पता कि कैसे, और यह एमएसडीएन राज्यों के बारे में नहीं है।

उत्तर

14

नहीं, प्रबंधित थ्रेड आईडी का ऑपरेटिंग सिस्टम की थ्रेड आईडी के साथ कोई संबंध नहीं है। सीएलआर केवल 1 से शुरू होने वाले धागे की संख्या है। यह SQL सर्वर समूह में एक प्रोजेक्ट का एक काफी दुखद दुष्प्रभाव है जिसने फाइबर के साथ .NET थ्रेड अनुकरण करने का प्रयास किया है। परियोजना को छोड़ दिया गया था, वे इसे पर्याप्त स्थिर नहीं मिल सका। अफसोस की बात है कि थ्रेड आईडी मैपिंग जिस तरह से था जब .NET 2.0 भेज दिया गया था। तकनीकी रूप से फीचर अभी भी कस्टम सीएलआर होस्ट्स के लिए थ्रेड को लागू करने के तरीके के लिए उपलब्ध है, मैं वास्तव में ऐसा करने वाले किसी भी मुख्यधारा के कार्यान्वयन से अवगत नहीं हूं। SQL सर्वर समूह विफलता एक विशाल लाल झंडा है।

obsoletion चेतावनी को बाईपास करने का एकमात्र तरीका GetCurrentThreadId() पिनवोक करना है। लिंक आपको सही पिनवोक घोषणा करने के लिए ले जाता है।

+0

जिज्ञासा से, मुझे लगता है कि kernell32.dll कॉल मोनो के तहत काम नहीं करेगा? स्रोत फ़ाइल में – IamIC

+2

"#pragma चेतावनी अक्षम 0618" जहां आप GetCurrentThreadId का उपयोग चेतावनी को दबाएंगे। – Neutrino

+1

न्यूट्रीनो की टिप्पणी के बारे में, [चेतावनी CS0618] अक्षम करना (http://msdn.microsoft.com/en-us/library/x5ye6x1e.aspx) उस फ़ाइल में सभी अप्रचलित चेतावनियों को अक्षम कर देगा। इसे '#pragma चेतावनी अक्षम 0618' में लक्ष्य कोड लपेटकर स्थानांतरित किया जा सकता है ... आपका कोड यहां ... '#pragma चेतावनी पुनर्स्थापित 0618'। ['#pragma चेतावनी 'संदर्भ यहाँ] (http://msdn.microsoft.com/en-us/library/441722ys.aspx) – cod3monk3y

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