繁体   English   中英

C#异步方法基于第一个完成的任务执行

[英]C# async method execute base on the first completed task

我有一个程序,该程序将从位于不同物理位置的2个读取器读取一些值。 对于一位读者,我知道我可以这样写:

private async void waitForReading()
{
    string result = await readFromReader1();    
    return result;
}

private async Task<string> readFromReader1()
{
    //poll until value detected
    return reader1Value;
}

private async Task<string> readFromReader2()
{
    //poll until value detected
    return reader2Value;
}

但是,如果我从两个阅读器中读取并在任务之一返回时恢复执行怎么办?

我想要实现的目标如下:

private async void waitForReading()
{
    string result = await readFromReader1() || readFromReader2();    
    return result;
}

可能吗?

您问题的基本答案是使用WhenAny

var task1 = readFromReader1Async();
var task2 = readFromReader2Async();
return await await Task.WhenAny(task1, task2);

但是,还有一些其他注意事项。

您在实现中提到“轮询”。 如果其他阅读器已经返回值,则可能要取消这种操作。 考虑使用CancellationToken启用取消。

考虑如何建模来自“读取器设备”的数据。 如果您总是只想按需查询它们,那么async方法就可以了。 但是,如果它们的数据可以随时更改(我怀疑是这种情况),那么您可能要考虑设置一个永久轮询并将其用作事件 在这种情况下,反应性扩展将是一个更合适的模型。

怎么样Task.WaitAny

Task<String> task1 = readFromReader1();
Task<String> task2 = readFromReader2();
String result = Task.WhenAny(new Task[]{task1, task2}).Result;

通过研究类似的问题: 并行运行两个异步任务并在.NET 4.5中收集结果

我受bart发布的Task.WhenAll方法的启发,发现Task.WhenAny(Task [])是我所需要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM