- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
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/
我调用提到的 Windows API。但它返回的线程 ID 与 _beginthreadex 返回的线程 ID 不同。我的代码如下, ThreadTest *_threadTest = new Thr
我想通过boost::thread::get_id和GetCurrentThreadId获取线程id。 但结果却不同。 我使用 boost::thread 来做多线程。为什么同一个线程使用 get_i
Windows NT 有一个很好的函数叫做GetCurrentThreadId顾名思义。它的实现非常快,因为它只是从线程本地存储中读取一个变量,该变量是在 NT 内核创建线程期间写入的。我想在 Lin
GetCurrentThreadId() 已被弃用,MSDN 指出 ManagedThreadId 取代了它。 但是,我得到了不同的结果,后者导致我的代码出现异常。我的代码改编自 this post
由于 AppDomin.GetCurrentThreadId() 已过时 "AppDomain.GetCurrentThreadId has been deprecated because it do
下面两行获取线程ID的代码有什么区别? Thread.currentThread().getId(); Kernel32.INSTANCE.GetCurrentThreadId(); 最佳答案 为了抽
我正在尝试创建一个 Hook 来监视鼠标光标的当前位置。没什么重要的,我只需要在界面设计期间计算一些像素,并想学习如何创建一个钩子(Hook),所以我决定走一条艰难的路,而不是理智的路。 我找到了声明
我是一名优秀的程序员,十分优秀!