我正在使用C#来控制硬件设备。该程序的结构为
硬件控制线程(正常的CPU优先级)
while (notFinished)
{
Prepare();
await DeviceCommunication();
autoResetEvent.WaitOne();
}
UI线程(正常的CPU优先级)
有一层用C#Task
编写的设备API。根据PC的状态,AutoResetEvent
连续执行后的Task
延迟有时高达500毫秒(繁重的计算线程甚至没有运行)。除了在某些关键的硬件控制时刻外,通常都很好。它需要10毫秒的响应时间。
我测试了将使用者线程设置为高于正常值,并模拟了异步函数以强制其同步。看来解决了问题。但是,在实际的异步函数中,有await
。他们立即释放线程。延续在线程池中的线程中。
问题1
500ms延迟正常吗?我在i5 2线程中使用VirtualBox。我希望目标PC的性能与我的相似。
假设我的发现有效。为了解决这个问题,我的选择是
Task.GetAwaiter().GetResult()
来使async同步。它不会导致死锁。Task
调度优先级和CPU优先级Task
库问题2
还有更好的选择吗?
问题3
如何做选择3(设置Task
调度优先级和CPU优先级)?自定义TaskScheduler
是唯一的方法吗?
答案 0 :(得分:0)
Windows不提供任何形式的调度保证。期。当设备驱动程序繁忙时,我们经常在Win7系统上看到C#代码的额外延迟几秒钟。如果您确实有严格的实时要求,则需要在RTOS上运行。