Я реорганизовал общий шаблон в своем проекте и обнаружил, что это не так просто, как использование LINQ Select
для асинхронной c функции.
Для контекста, вот как это делается в настоящее время.
async Task<ICollection<Group>> ExecuteQueryGroupsForDomain(DomainInfo domain, int batchSize, CancellationToken ct)
{
try
{
return await BlahBlahActuallyGoGetGroupsForDomainHere(domain, batchSize, ct);
}
catch (Exception e)
{
return null;
}
}
var executeQueries = new List<Func<CancellationToken, Task<ICollection<Group>>>>();
domains.ForEach(domain =>
executeQueries.Add(async (ct) =>
await ExecuteQueryGroupsForDomain(domain, 123, ct)));
Теперь, если я попытаюсь заменить секцию ForEach
l oop с помощью LINQ:
var executeQueries = domains.Select(domain =>
async (ct) => await ExecuteQueryGroupsForDomain(domain, 123, ct));
Она жалуется Type arguments cannot be inferred by the usage
, что приводит меня к полагаю, что я ничего не возвращаю из Select
, но я явно возвращаю Func
, который я хочу.
Есть ли лучший способ создать список Func
, в идеале избегая явного слепки? Также есть какое-то объяснение, почему компилятор не может определить тип, когда метод Select
'd asyn c четко указывает, каким должен быть тип?
Чтобы было понятно, я нужно передать CancellationToken
Func
, потому что это токен, отличный от внешнего (в частности, это связанный токен, связывающий внешний с другим внутренним).