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

问题描述 投票:0回答:1

我必须创建一个通过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类等。

如果有人遇到类似的困境,我将不胜感激任何关于哪种方法更好的反馈。

谢谢。

events async-await task c#-7.0 event-driven
1个回答
1
投票

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

事件是推送模型(System.Reactive,a.k.a。“LINQ over events”)也是如此。我们的想法是您订阅该事件,然后您的处理程序被调用零次或多次。

任务是拉模型。这个想法是你开始一些操作,Task会在完成时告诉你。任务的一个缺点是它们仅代表单个结果。

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

在您的情况下,您正在开始操作(测试),等待它完成,然后读取结果。这听起来很像拉模型在这里是合适的,所以我推荐Task<T> over events / Rx。

© www.soinside.com 2019 - 2024. All rights reserved.