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

时间:2018-11-25 12:01:06

标签: c# windows multithreading task real-time

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

  1. 硬件控制线程(正常的CPU优先级)

    while (notFinished)
    {
        Prepare();
        await DeviceCommunication();
        autoResetEvent.WaitOne();
    }
    
  2. UI线程(正常的CPU优先级)

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

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

我测试了将使用者线程设置为高于正常值,并模拟了异步函数以强制其同步。看来解决了问题。但是,在实际的异步函数中,有await。他们立即释放线程。延续在线程池中的线程中。


问题1

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


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

  1. 使用Task.GetAwaiter().GetResult()来使async同步。它不会导致死锁。
  2. 重写设备API层以支持真正的同步操作。它很雅致,遵循一般规则,但是很不错。
  3. 设置Task调度优先级和CPU优​​先级
  4. 使用第三方Task

问题2

还有更好的选择吗?


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

1 个答案:

答案 0 :(得分:0)

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