繁体   English   中英

如何将 CPU 内核限制为 C# 中的特定线程

[英]How Can I Limit CPU core to specific thread in C#

在我的程序中,定期发送和接收 UDP 数据。 如果只有这一个程序在整个计算机上运行,结果是正常的。 但是如果同时进行其他操作(比如打开一个PDF文档),UDP通信会受到影响,会出现接收超时。 通过观察任务管理器,在执行其他操作时,CPU使用率会暂时升高,影响我的程序运行。 由于我的电脑是多核的(12核),我尝试将我的关键线程绑定到某个核上,但还是不行,其他线程仍然会被系统分配给这个核。

keyThread.IdealProcessor = 9;
keyThread.ProcessorAffinity = (IntPtr)512;

我想我需要的是将某个 CPU 内核绑定到程序的关键线程上,而不是反过来。 但我没有找到办法做到这一点。

添加一些关于我的程序的细节。

timer.interval = 10;    //10ms
localSocket.Connect(remotePoint);
localSocket.ReceiveTimeout = 10;    //10ms
private void Timer_Ticked() 
{     
    byte[] requestFrame = new byte[1024];     
    requestFrame = frameManager.GenerateFrame();     
    localSocket.Send(requestFrame);     
    try     
    {         
        byte[] responseFrame = new byte[1024];         
        localSocket.Receive(responseFrame);     
    }     
    catch (Exception)     
    {         
        Console.WriteLine("receive timeout");     
    } 
}

我添加了新代码以将进程的优先级设置为实时,并将线程的优先级设置为最高,但当我在计算机中执行其他操作时(如打开 PDF 文件或打开 Chrome),仍然无法正常工作,我的程序受到影响。

我观察Windows 10的任务管理器,当我执行一个操作(比如打开一个PDF文档)时,所有CPU核心的使用都会出现一个峰值。 我可以指定一个 CPU 内核只为我的程序工作而不被其他程序使用吗?

经验法则: UDP数据可能会丢失,系统必须设计一种方法来克服这种丢失。 否则,将使用其他协议,例如带有内置确认和重试的 TCP 或 SCTP 等。

鉴于此,追求 UDP 稳定性的目标是错误的目标。 尽管您付出了努力,但系统迟早会遇到特定 UDP 数据包丢失的情况。 也许不是发件人或收件人的错误(原文如此)。 这可能发生在中间路由器上,因为每个人都同意 UDP 最终可以被丢弃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM