簡體   English   中英

運行並行異步任務?

[英]Running parallel async tasks?

因此,我一直在搜索StackOverflow / Google,尋找同時運行多個異步任務的不同方法。 在不同方法之間似乎存在很多爭論,我只想澄清一下。 我正在編寫一個程序來執行JSON POST請求,直到服務器返回狀態碼200。假設我要並行運行其中的5個任務,直到其中一個返回狀態碼200。請盡量不要偏離主題,我無法控制服務器! 這是我當前的代碼,

    static bool status = false;
    public static async Task getSessionAsync() {
        while(!status) { ... } 
    }
    public static async Task doMoreStuff() {
       ...
    }
    public static async Task RunAsync() 
    {
        await getSessionAsync ();
        await doMoreStuff();
    }
    public static void Main (string[] args)
    {
        Task.WhenAll(RunAsync()).GetAwaiter().GetResult();
    }

基本上,我想知道我這樣處理是否錯誤,

    public static async Task RunAsync() 
    {
        for(int i = 0; i < 5; i++) {
            await getSessionAsync ();
        }
        await doMoreStuff();
    }

假設:

private Task<MySession> GetSessionAsync()
{
    // ...
}

選項1

Task.WhenAny

var session = await await Task.WhenAny(Enumerable.Range(0, 5).Select(_ => GetSessionAsync()));

選項2

您可以使用稱為Amb的Rx LINQ方法,該方法將僅觀察第一個返回內容的Observable。

var session = await Enumerable.Range(0, 5).Select(_ => GetSessionAsync().ToObservable()).Amb().ToTask();

這不會並行運行:

public static async Task RunAsync() 
{
    for(int i = 0; i < 5; i++) {
        await getSessionAsync ();
    }
    await doMoreStuff();
}

您必須使用Task.WhenAny()

public static async Task RunAsync() 
{
    var tasks = new List<Task>();
    for(int i = 0; i < 5; i++) {
        tasks.Add(getSessionAsync());
    }
    await Task.WhenAny(tasks);
    await doMoreStuff();
}

如果不需要當前上下文(即在編寫庫而不是前端代碼時),請不要忘記在每次等待后使用ConfigureAwait(false)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM