[英]Real time AutoResetEvent after async-await continuation in C#
我正在使用 C# 来控制硬件设备。 该程序的结构为
一个硬件控制线程(普通CPU优先级)
while (notFinished) { Prepare(); await DeviceCommunication(); autoResetEvent.WaitOne(); }
一个 UI 线程(普通 CPU 优先级)
有一层用 C# Task
编写的设备 API。 Task
继续后的AutoResetEvent
延迟有时高达 500 毫秒,具体取决于 PC 的状态(繁重的计算线程甚至没有运行)。 除了在一些关键的硬件控制时刻外,它通常很好。 它需要 10ms 的响应时间。
我测试了将使用者线程设置为高于正常值并模拟异步函数以强制其同步。 它似乎解决了这个问题。 然而,在真正的异步函数中,有await
。 他们立即释放线程。 延续位于线程池中的线程中。
问题 1
500ms延迟正常吗? 我正在使用带有 i5 2 个线程的 VirtualBox。 我希望目标 PC 的性能与我的相似。
假设我的发现是有效的。 为了解决这个问题,我的选择是
Task.GetAwaiter().GetResult()
将异步变为同步。 它不应该导致死锁。Task
调度优先级和CPU优先级Task
库问题2
有更好的选择吗?
问题 3
如何做选择3(设置Task
调度优先级和CPU优先级)? 自定义TaskScheduler
是唯一的方法吗?
Windows 不提供任何类型的任何调度保证。 时期。 当设备驱动程序繁忙时,我们经常看到 Win7 系统上的 C# 代码有几秒钟的额外延迟。 如果您确实有严格的实时要求,则需要在 RTOS 上运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.