gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:58:43 25 4
gpt4 key购买 nike

我有一个程序可以从位于不同物理位置的 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 方法就可以了。但是,如果他们的数据可以随时更改(我怀疑是这种情况),那么您可能需要考虑设置一个永久 轮询并将其作为事件;在这种情况下,Reactive Extensions 将是更合适的模型。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com