如何在C#中将CPU核心限制在特定线程



在我的程序中,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数据是CAN丢失的数据,系统MUST必须设计为克服这种损失的方法。否则,将采用另一种协议,如具有内置确认的TCP&重试,或SCTP等

鉴于此,追求UDP稳定性的目标是一个错误的目标。尽管您做出了努力,但系统迟早会遇到特定UDP数据包丢失的情况。可能不是由于发送方或接收方的故障(原文如此!(。这可能发生在介于两者之间的临时路由器上,因为每个人都同意UDP最终会被丢弃。

相关内容

  • 没有找到相关文章

最新更新