我必须创建一个库,该库通过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} }类等
如果有人遇到类似的难题,请反馈有关哪种方法更好的建议。
谢谢。
答案 0 :(得分:1)
有几种工具可用于构建代码。
事件是一个 push 模型(System.Reactive,也称为“ LINQ over events”)。这个想法是您订阅事件,然后您的处理程序被调用零次或多次。
任务是 pull 模型。这个想法是您开始一些操作,Task
将在完成时通知您。任务的一个缺点是它们仅代表一个结果。
即将到来的异步流也是一种 pull 模型-一种可用于多种结果的模型。
在您的情况下,您正在开始一项操作(测试),等待其完成,然后读取结果。这听起来很像 pull 模型在这里比较合适,所以我建议在event / Rx上使用Task<T>
。