1
我有一個稱爲VehicleInfoFetcher
抽象類,異步從WebClient
通過此方法返回信息:異步/等待 - 我是否正確運行這些方法並行?
public override async Task<DTOrealtimeinfo> getVehicleInfo(string stopID);
我想這個類的兩個分開的實例的結果組合,結合之前運行的每個並聯結果。這是在第三類,CombinedVehicleInfoFetcher
(本身也是VehicleInfoFetcher
的子類)完成的。
這是我的代碼 - 但我不太相信它正在並行運行任務;我做對了嗎?它可以優化嗎?
public class CombinedVehicleInfoFetcher : VehicleInfoFetcher
{
public HashSet<VehicleInfoFetcher> VehicleInfoFetchers { get; set; }
public override async Task<DTOrealtimeinfo> getVehicleInfo(string stopID)
{
// Create a list of parallel tasks to run
var resultTasks = new List<Task<DTOrealtimeinfo>>();
foreach (VehicleInfoFetcher fetcher in VehicleInfoFetchers)
resultTasks.Add(fetcher.getVehicleInfo(stopID, stopID2, timePointLocal));
// run each task
foreach (var task in resultTasks)
await task;
// Wait for all the results to come in
await Task.WhenAll(resultTasks.ToArray());
// combine the results
var allRealtimeResults = new List<DTOrealtimeinfo>(resultTasks.Select(t => t.Result) );
return combineTaskResults(allRealtimeResults);
}
DTOrealtimeinfo combineTaskResults(List<DTOrealtimeinfo> realtimeResults)
{
// ...
return rtInfoOutput;
}
}
編輯
一些非常有用的答案,這裏是一個重新編寫例子來幫助討論,下面USR:
public override async Task<object> combineResults()
{
// Create a list of parallel tasks to run
var resultTasks= new List<object>();
foreach (AnotherClass cls in this.OtherClasses)
resultTasks.Add(cls.getResults());
// Point A - have the cls.getResults() methods been called yet?
// Wait for all the results to come in
await Task.WhenAll(resultTasks.ToArray());
// combine the results
return new List<object>(resultTasks.Select(t => t.Result) );
}
}
我還是很困惑。你說'await'不會啓動Tasks,但是如果我要把單行'await getVehicleInfo(「foo」);'這會啓動任務,對吧? –
不,任務已經開始。等待任務完成後纔會繼續執行。試試這個:'等待新的TaskCompletionSource
如果你不說「等待」,任務仍然會同時運行。 – usr