У меня есть метод действий контроллера Async, который вызывает 4 метода async для моего Backend для возврата списка из каждого. Список объектов для каждого метода отличается. т.е. список Список т.д.Несколько методов Async, лучше всего использовать WhenAll с разными типами возвращаемых данных
я это работает, как так:
BizProvider bp = new BizProvider();
List<biz.Customer> custReturn = await bp.GetCustomerAsync();
List<biz.Account> acctReturn = await bp.GetAccountAsync();
...plus 2 more
List<object> returnArr = new List<object>();
returnArr.Add(custReturn);
returnArr.Add(acctReturn); ...plus 2 more
return JsonConvert.SerializeObject(returnArr);
Должен ли я использовать Task.WhenAll
из нескольких задач?
Пример на майкрософт https://msdn.microsoft.com/en-us/library/hh194874%28v=vs.110%29.aspx
Все эти задачи возвращают List<int>
Так я и абстрактный класс и имел все мои список типов объектов наследуют от этого. и я изменил тип возврата моего провайдера бизнес-объекта, чтобы вернуть список абстрактного типа так что теперь я могу сделать:
var tasks1 = new List<Task<List<Biz.AbstractClass>>>();
tasks1.Add(bp.GetCustomerAsAbstractAsync());
tasks1.Add(bp.GetAccountAsAbstractAsync());
...plus 2 more
Я тогда называть вар продолжение = Task.WhenAll (tasks1);
это выполняет следующую строку, которую он получает до .Results
, но затем прекращает выполнение ???
foreach (var result in continuation.Result)
^stops here
далее я называю
returnArrays.Add(result1);
return JsonConvert.SerializeObject(returnArrays);
, но они никогда не попасть ... Я не знаю, почему. Возможно, мне не нужен WhenAll
, но тогда мне все еще интересно, что происходит не так. Возможно, мне нужно ждать определенных функций или вызвать действие так или иначе, как в ссылке Microsoft, функции называются встроенными.
Task.Run(async() => { x=x,etc...)
Редактировать 20150306 => Добавление большего количества деталей реализации
CustMan cm = new CustMan();
List<object> returnArr = new List<object>();
var aTask = cm.GetCustomersAsync();
var bTask = cm.GetAccountsAsync();
await Task.WhenAll(aTask, bTask);
returnArr.Add(aTask.Result);//same for bTask <-- breakpoint never hits
return JsonConvert.SerializeObject(returnArr);
//also .js ajax return method never comes back.
//in CustMan()
public async Task<List<biz.Customer>> GetCustomersAsync() {
List<biz.Customer> custList = await (from contact in ObjectContextDb.GetData<da.ContactInfo>()//<--generic returns IQueryable
join customerContact in ObjectContextDb.GetData<da.CustomerContact>() on contact.Id equals customerContact.ContactInfoID
join customerOrg in ObjectContextDb.GetData<da.CustomerOrganisation>() on customerContact.OrgID equals customerOrg.Id
orderby contact.LastName
select new biz.Customer {
CustomerContactInfo = new biz.Contact() {
ID = contact.Id,
WorkPhone = contact.WorkPhone
},
CustomerOrg = new biz.CustomerOrganisation {
ID = facultyOrg.Id,
Name = facultyOrg.OrgName,
ClientID = (customerContact.ClientID.HasValue ? customerContact.ClientID.Value : 0)
}
}).ToListAsync<biz.Customer>();
return custList;// <-- Breakpoint hits here, the List has items
}
public async Task<List<biz.Account>> GetAccountsAsync()
{
var roles = (from acctType in ObjectContextDb.GetData<da.AccountInType>()
join r in ObjectContextDb.GetData<da.AccountType>() on acctType.AccountTypeID equals r.ID
select new
{
AccountId = acctType.AccountID,
Type = r.TypeName
}); //.ToList();
List<biz.Account> allContacts = await (from account in ObjectContextDb.GetData<da.Account>()
orderby account.Name
select new biz.Account()
{
Number = account.Id,
Name = account.Name,
Roles = (from r in roles where account.Id == r.AccountId select r.Type).ToList()
}).ToListAsync<biz.Account>();
return allContacts;// <-- Breakpoint hits here, the List has items
}
Метод, который вызывает методы класса менеджера без WhenAll
работ!
CustMan cm = new CustMan();
List<object> returnArrays = new List<object>();
List<biz.Customer> custReturn = await cm.GetCustomersAsync();
List<biz.Account> acctReturn = await cm.GetAccountsAsync();
returnArrays.Add(custReturn);
returnArrays.Add(acctReturn);
return JsonConvert.SerializeObject(returnArrays);
Вы можете вызвать '.GetAllFacultyAsync()' и '.GetAllContactsWithRolesAsync()' и ждать их позже. Это вызовет все асинхронные запросы, но ждет их позже, сохраняя их строго типизированными. – Caramiriel