我用下面的方法來異步執行一些任務,並在同一時間:異步任務是兩次評估
public async Task<Dictionary<string, object>> Read(string[] queries)
{
var results = queries.Select(query => new Tuple<string, Task<object>>(query, LoadDataAsync(query)));
await Task.WhenAll(results.Select(x => x.Item2).ToArray());
return results
.ToDictionary(x => x.Item1, x => x.Item2.Result);
}
我想要的方法來調用LoadDataAsync
用於在同一時間陣列中的每個字符串,然後等到所有任務完成並返回結果。
- 如果我像這樣運行的方法,它在最後
.Result
屬性的getter調用LoadDataAsync
兩次,每次項目,一旦在await ...
線,並一次。 - 如果我刪除
await ...
行,Visual Studio會警告說整個方法可以並行運行,因爲方法內部沒有調用await
。
我在做什麼錯?
有沒有更好(更短)的方法來做同樣的事情?
嗯,當然他們是 - 你在枚舉結果查詢兩次。如果首先使用'queries ... ToArray()',它將起作用。你枚舉兩次'queries',每次都做一個新的'LoadDataAsync'。 – Luaan 2014-09-30 15:38:16
我對你的代碼示例有些困惑。數組'items'被忽略,並使用一個叫做'queries'的神祕全局變量。你發佈了一個不完整的代碼示例嗎? – 2014-09-30 15:46:48
是的,對不起。更正它。不應該在SO內進行代碼編輯。 – cheeesus 2014-09-30 17:16:01