繁体   English   中英

在 C# 中异步等待继续后的实时 AutoResetEvent

[英]Real time AutoResetEvent after async-await continuation in C#

我正在使用 C# 来控制硬件设备。 该程序的结构为

  1. 一个硬件控制线程(普通CPU优先级)

     while (notFinished) { Prepare(); await DeviceCommunication(); autoResetEvent.WaitOne(); }
  2. 一个 UI 线程(普通 CPU 优先级)

  3. 一个繁重的计算线程(低于正常的 CPU 优先级)

有一层用 C# Task编写的设备 API。 Task继续后的AutoResetEvent延迟有时高达 500 毫秒,具体取决于 PC 的状态(繁重的计算线程甚至没有运行)。 除了在一些关键的硬件控制时刻外,它通常很好。 它需要 10ms 的响应时间。

我测试了将使用者线程设置为高于正常值并模拟异步函数以强制其同步。 它似乎解决了这个问题。 然而,在真正的异步函数中,有await 他们立即释放线程。 延续位于线程池中的线程中。


问题 1

500ms延迟正常吗? 我正在使用带有 i5 2 个线程的 VirtualBox。 我希望目标 PC 的性能与我的相似。


假设我的发现是有效的。 为了解决这个问题,我的选择是

  1. 使用Task.GetAwaiter().GetResult()将异步变为同步。 它不应该导致死锁。
  2. 重写设备 API 层以支持真正的同步操作。 它很优雅并遵循一般规则,但它们很好。
  3. 设置Task调度优先级和CPU优​​先级
  4. 使用第 3 方Task

问题2

有更好的选择吗?


问题 3
如何做选择3(设置Task调度优先级和CPU优​​先级)? 自定义TaskScheduler是唯一的方法吗?

Windows 不提供任何类型的任何调度保证。 时期。 当设备驱动程序繁忙时,我们经常看到 Win7 系统上的 C# 代码有几秒钟的额外延迟。 如果您确实有严格的实时要求,则需要在 RTOS 上运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM