Здравствуйте, Lloyd, Вы писали:
L>Если красиво — то написать функцию, которая принимает на вход функцию и возвращает функцию, которая будучи вызвана, вызывает переданную функцию только в том случае, если функция уже закончила работу. И в обработчике таймера дергать это функцию.
L>Надеюсь, понятно объяснил?
Как-то так:
using System;
using System.Threading;
class Program
{
private static readonly Action<int> PrintOnceInTime = FunctionalHelpers.OnceInTime<int>(Print);
private static void Print(int i)
{
Console.WriteLine(i);
Thread.Sleep(1000);
}
static void Main()
{
for (int i = 0; i < 10000; i++)
{
PrintOnceInTime.BeginInvoke(i, null, null);
Thread.Sleep(250);
}
}
}
public static class FunctionalHelpers
{
public static Action<T> OnceInTime<T>(Action<T> action)
{
bool isRuning = false;
return t =>
{
if (isRuning)
return;
try
{
isRuning = true;
action(t);
}
finally
{
isRuning = false;
}
};
}
}