2015-10-21 72 views
3

我想執行任務列表,並在任何任務完成後執行同步操作,但我需要知道它們是哪個。Task.WhenAny ContinueWith:獲取參數?

查看我的示例,並查看代碼中的註釋,該註釋位於我不知道如何實現的幾行之前。

public async Task<bool> GreetAsync(string name) 
{ 
    if (name == null) 
    return false; 

    await InternalGreeter.GreetAsync(name); 
    return true; 
} 

public async Task GreetAllAsync() 
{ 
    var tasks = UserNames.Select(un => GreetAsync(un)).ToList(); 

    while(tasks.Any()) 
    { 
    var finished = await Task.WhenAny(tasks); 

    if(finished.Result) 
    { 
     //Here's what I'd like to achieve 
     var username = finished.Arguments[0]; 
     WriteLine($"User {username} has been greeted."); 
    } 

    tasks.Remove(finished); 
    } 
} 

基於this示例。

在我的真實世界中,我有一個客戶列表,我必須一個接一個地遍歷它們並更新遠程服務器的信用狀態(遠程服務器不支持批量更新)。每次更新後,我必須在我的數據庫中標記此客戶已獲得認證。

+1

那麼,你的問題是什麼? –

+0

你做了什麼,發生了什麼? –

+0

我不認爲你可以(應該?)這樣做。爲什麼不只是'UserNames.Select(un => GreetAsync(un))。ContinueWith(...)。ToList();'? – DavidG

回答

-1

爲什麼不簡單地使用ContinueWith?像這樣:

public async Task GreetAllAsync(List<string> UserNames) 
{ 
    var tasks = UserNames 
    .Select(un => GreetAsync(un) 
     .ContinueWith(x => { 
      Console.WriteLine(un + " has been greeted"); 
     })); 

    await Task.WhenAll(tasks); 
} 
6

你幾乎從不想一次處理一個任務列表,因爲他們完成這樣的任務。相反,只需引入更高級別的操作,並將Task.WhenAny重寫爲Task.WhenAll以等待這些更高級別的操作。

public async Task<bool> GreetAsync(string name) 
{ 
    if (name == null) 
    return false; 

    await InternalGreeter.GreetAsync(name); 
    return true; 
} 

private async Task<bool> GreetAndReportGreetedAsync(string name) 
{ 
    var result = await GreetAsync(name); 
    WriteLine($"User {name} has been greeted."); 
    return result; 
} 

public async Task GreetAllAsync() 
{ 
    await Task.WhenAll(UserNames.Select(un => GreetAsync(un)); 
} 
+0

'GreetAndGreetAsync'可以是lambda表達式,還是有沒有更好的方法,不需要專用的方法?順便說一句,我已經更新了我的問題。 – Shimmy

+1

@Shimmy:當然,任何方法都可以是lambda表達式。我不認爲它是「更好的」,但如果你喜歡它:'await Task.WhenAll(UserNames.Select(async un => {if(await GreetAsync(un))WriteLine($「User {un} has been greeted 。「);}));' –