簡體   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