[英]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.