gpt4 book ai didi

c# - 替换 AppDomain.GetCurrentThreadId();使用 ManagedThreadId

转载 作者:太空狗 更新时间:2023-10-29 22:14:17 27 4
gpt4 key购买 nike

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() .该链接带您进行正确的 pinvoke 声明。

关于c# - 替换 AppDomain.GetCurrentThreadId();使用 ManagedThreadId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13100609/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com