我必须创建一个通过COM端口与设备通信的库。
在其中一个函数中,我需要发出一个命令,然后在执行测试时等待几秒钟(从10到1000秒不等)并返回测试结果:
一种方法是使用async-await模式:
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
,因为它很容易建立取消和缺乏一个更好的术语,它是自包含的,即我不必宣布一个事件,创建一个EventArgs
类等。
如果有人遇到类似的困境,我将不胜感激任何关于哪种方法更好的反馈。
谢谢。
有几种工具可用于构建代码。
事件是推送模型(System.Reactive,a.k.a。“LINQ over events”)也是如此。我们的想法是您订阅该事件,然后您的处理程序被调用零次或多次。
任务是拉模型。这个想法是你开始一些操作,Task
会在完成时告诉你。任务的一个缺点是它们仅代表单个结果。
即将到来的异步流也是拉模型 - 一种适用于多种结果的模型。
在您的情况下,您正在开始操作(测试),等待它完成,然后读取结果。这听起来很像拉模型在这里是合适的,所以我推荐Task<T>
over events / Rx。