GetCurrentThreadId()已被弃用,MSDN声明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);
        }

我可以看到问题是一个获取线程的进程ID,而另一个获取应用程序的进程ID。

如何在不使用不推荐使用的方法的情况下使它正常工作?最初的Stack Overflow文章指出要使用P/Invoke,但我不知道如何使用,这不是MSDN所指出的。

最佳答案

不,ManagedThreadId与操作系统的线程ID完全没有关系。 CLR简单地从1开始对线程进行编号。这是SQL Server组中试图用光纤模拟.NET线程的项目的一个相当悲惨的副作用。该项目被放弃了,他们无法使其足够稳定。不幸的是,线程ID映射保留了.NET 2.0发行时的方式。从技术上讲,该功能仍可用于自定义CLR主机,以其所需的方式实现线程,我不知道实际上有任何主流的实现方式。 SQL Server组故障是一个巨大的危险信号。

绕过过时警告的唯一方法是调用GetCurrentThreadId()。该链接将带您进行正确的拼音声明。

09-30 20:37