簡體   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