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

标签 c# asynchronous concurrency

我有一个程序,可以从位于不同物理位置的 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 来启用取消。

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

关于C# 异步方法根据第一个完成的任务执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29888786/

相关文章:

javascript - 使html成为标签href等待onclick中的异步函数返回?

Node.JS/async for 循环,嵌套回调中的当前迭代

node.js - 如何使用node.js发布页面

php - 处理相同的函数同时运行和处理相同的数据

java - 我应该限制我拥有的执行者的数量吗?

c# - tpl 数据流最大并行度

c# - 如何在 Linq-to-SQL 类上捕获 Save 或 Load 事件?

c# - MVC ActionLink 从当前 url 添加所有(可选)参数

c# - 在 RichTextBox C# WinForms 中自动滚动

c# - 改变表达式的返回类型<func<>>