长时间运行的异步方法与在完成时触发事件

时间:2019-04-25 08:23:50

标签: events async-await task c#-7.0 event-driven

我必须创建一个库,该库通过COM端口与设备通信。

在其中一个功能中,我需要发出命令,然后等待几秒钟执行测试(从10到1000秒不等)并返回测试结果:

一种方法是使用异步等待模式:

public async Task<decimal> TaskMeasurementAsync(CancellationToken ctx = default)
{
    PerformTheTest();

    // Wait till the test is finished
    await Task.Delay(_duration, ctx);

    return ReadTheResult();
 }

我想到的另一个就是在完成时触发一个事件。

设备执行测试,并在执行测试之前指定持续时间。因此,无论哪种情况,我都必须使用Task.Delay()Thread.Sleep()来等待设备上任务的完成。

我倾向于async-await,因为它易于构建取消,并且由于缺少更好的术语,它是独立的,即我不必声明事件,创建{{1} }类等

如果有人遇到类似的难题,请反馈有关哪种方法更好的建议。

谢谢。

1 个答案:

答案 0 :(得分:1)

有几种工具可用于构建代码。

事件是一个 push 模型(System.Reactive,也称为“ LINQ over events”)。这个想法是您订阅事件,然后您的处理程序被调用零次或多次。

任务 pull 模型。这个想法是您开始一些操作,Task将在完成时通知您。任务的一个缺点是它们仅代表一个结果。

即将到来的异步流也是一种 pull 模型-一种可用于多种结果的模型。

在您的情况下,您正在开始一项操作(测试),等待其完成,然后读取结果。这听起来很像 pull 模型在这里比较合适,所以我建议在event / Rx上使用Task<T>