[英]Why should I prefer single 'await Task.WhenAll' over multiple awaits?
[英]How to simplify multiple awaits with a single 'await Task.WhenAll'?
我假設我必須在下面的代碼中使用Task.WhenAll
但無法弄清楚它應該正確實現。
請幫忙。
public async void UpdateData()
{
var month = (cbMonths.SelectedItem as MonthView).ID;
var year = (cbYears.SelectedItem as YearView).ID;
var deviceTypeID = (int)DeviceType;
var calendar = await GetCalendar(month, year, deviceTypeID);
var workTypes = await GetWorkTypes();
if (calendar != null && workTypes != null) // Task.WhenAll ???
{
//...
}
}
private async Task<List<WorkTypeItem>> GetWorkTypes()
{
try
{
HttpClient client = new HttpClient();
var url = Properties.Settings.Default.ServerBaseUrl + @"/api/staff/WorkTypes";
HttpResponseMessage response = await client.GetAsync(url);
if (response.IsSuccessStatusCode) // Check the response StatusCode
{
var serSettings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All };
string responseBody = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<List<MSOCommon.WorkTypeItem>>(responseBody, serSettings);
}
else
{
logger.Error(Properties.Resources.DATACannotGetWorkTypes);
}
}
catch (Exception ex)
{
logger.Error(Properties.Resources.DATACannotGetWorkTypes + " " + ex.Message);
}
return null;
}
如果您希望兩個任務同時執行,則不要await
這些方法。 而是將他們的任務傳遞給變量並在Task.WhenAll
調用它們
public async Task UpdateData() {
var month = (cbMonths.SelectedItem as MonthView).ID;
var year = (cbYears.SelectedItem as YearView).ID;
var deviceTypeID = (int)DeviceType;
var task1 = GetCalendar(month, year, deviceTypeID);
var task2 = GetWorkTypes();
await Task.WhenAll(task1, task2);
var calendar = task1.Result;
var workTypes = task2.Result;
}
另請注意,您應該避免使用async void
方法。
var calendarTask = GetCalendar(month, year, deviceTypeID);
var workTypesTask = GetWorkTypes();
Task.WaitAll(calendarTask, workTypesTask);
var calendar = await calendarTask;
var workTypes = await workTypesTask;
要回答 @crazyGamer ,您這樣做的原因是為了讓兩個任務可以同時運行。 否則,您甚至在開始第二個任務之前就在等待第一個任務。 當然,如果他們相互依賴,那是一件好事。 否則,這會在 MP 系統上運行得更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.