【发布时间】:2022-01-22 13:58:27
【问题描述】:
在我的程序中,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 内核只为我的程序工作而不被其他程序使用吗?
【问题讨论】:
-
您如何发送和接收数据包。我们能看到那个代码吗?我们可能能够使用 .NET 任务调度程序来发挥我们的优势,而不是通过手动为线程分配亲和性来做到这一点。 cpu 亲和力也没有保证,执行最终取决于操作系统
-
接收超时多长时间?是否在毫秒范围内?
-
timer是什么?是System.Windows.Forms.Timer控件吗? -
@TheodorZoulias 不是系统的定时器,是dll文件中提供的定时器,精度为1ms。
-
此计时器是否提供任何保护以防止
Ticked事件的重叠调用?
标签: c# multithreading udp threadpool multicore