У меня есть следующий код, в котором я использую async-ключевое слово в моем предложении GroupBy, однако мне говорят, что этот вызов не ожидается и будет выполняться синхронно , мой вопрос состоит в том, будут ли мои два звонка GetAllLanguages
и GetAllStores
, а мой последующий вызов Task.WaitAll(languagesTask, storesTask);
использует функции async или все мои коды запускаются синхронно, так как я не ожидаю оператора GroupBy. также можно дождаться звонка .GroupBy(async resourceApplicationType ..
.Я получаю преимущества async и жду в следующем коде
public async Task UpdateAllResources()
{
var applicationTypes = databaseSettings.Select(dbcs => dbcs.ResourceApplicationType);
var commandsPerApplication = applicationTypes
.GroupBy(async resourceApplicationType =>
{
var languagesTask = GetAllLanguages(resourceApplicationType);
var storesTask = GetAllStores(resourceApplicationType);
var resourceCategory = ResourceApplicationToCategoriesMapper.Map(resourceApplicationType);
Task.WaitAll(languagesTask, storesTask);
var commands = from category in resourceCategory
from language in languagesTask.Result
from store in storesTask.Result
select new UpdateResourcesCommand
{
ApplicationType = resourceApplicationType,
StoreCode = store.Code,
LocaleCode = language.Locale,
ResourceCategory = category
};
return new
{
applicationType = resourceApplicationType, commands
};
});
commandsPerApplication.ForEach(commandsGroup =>
{
commandsGroup.Key.Result.commands.ForEach(async command =>
{
await commandExecutor.Execute<UpdateResourcesCommand, Task>(command);
});
});
}
private Task<IEnumerable<Language>> GetAllLanguages(ResourceApplication applicationType)
{
return allLanguagesQueryRetriever.GetByComponentName(InstanceName.GetUniqueName<IAllLanguagesQuery>(applicationType.ToString()))
.Execute(new AllLanguagesCriteria());
}
private Task<IEnumerable<Store>> GetAllStores(ResourceApplication applicationType)
{
return allStoresQueryRetriever
.GetByComponentName(InstanceName.GetUniqueName<IAllStoresQuery>(applicationType.ToString()))
.Execute(new AllStoresCriteria());
}
Вы не ожидал 'Task.WaitAll (languagesTask, storesTask);' в 'UpdateAllResources'. Это может означать, что задача еще не закончена, прежде чем вы попытаетесь получить доступ к результату. – JConstantine
@JLevett это утверждение не является ожидаемым. «Тип void не является ожидаемым», он, по сути, ожидает. – Xerxes
Приношу свои извинения. Вы также можете использовать 'await Task.WhenAll()' – JConstantine