[英]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.