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