Две перегрузки метода, асинхронный и синхронизирующий лямбда-параметры, одна реализация, без захваченных аргументов. Является ли это возможным?
У меня есть метод, который принимает параметр лямбда и многократно вызывает эту лямбду несколько раз с задержкой. И метод, и лямбда асинхронны:
static async Task LoopAsync(Func<int, Task> action,
int start, int count, int delayMsec)
{
for (int i = start; i < start + count; i++)
{
await Task.Delay(delayMsec).ConfigureAwait(false);
await action(i).ConfigureAwait(false);
}
}
Теперь я хочу улучшить с помощью перегрузки, которая принимает синхронный лямбда-параметр (Action<int>
). Я хочу избежать дублирования своего кода, поэтому я думаю реализовать перегрузку, используя существующую реализацию следующим образом:
static Task LoopAsync(Action<int> action,
int start, int count, int delayMsec)
{
return LoopAsync(i =>
{
action(i); return Task.CompletedTask;
}, start, count, delayMsec);
}
Что мне не нравится в этом подходе, так это то, что он фиксируетaction
аргумент, что приводит к выделению объекта каждый раз, когдаLoopAsync
вызывается. Я хочу предотвратить этот захват. Является ли это возможным?
Подводя итог, я хочу иметь две перегрузки метода, первую с асинхронной лямбдой и вторую с синхронной лямбдой, которые используют одну и ту же реализацию, не подвергаясь штрафу за выделение объектов замыкания в куче. Я одинаково согласен с тем, что одна перегрузка основана на другой, или на том, что обе основаны на одном и том же.private
основная реализация.
Этот вопрос был вдохновлен недавним вопросом Аврохома Исроэля.