Две перегрузки метода, асинхронный и синхронизирующий лямбда-параметры, одна реализация, без захваченных аргументов. Является ли это возможным?

У меня есть метод, который принимает параметр лямбда и многократно вызывает эту лямбду несколько раз с задержкой. И метод, и лямбда асинхронны:

      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основная реализация.

Этот вопрос был вдохновлен недавним вопросом Аврохома Исроэля.

0 ответов

Другие вопросы по тегам