Re[2]: запуск по таймеру
От: Lloyd Россия  
Дата: 25.01.11 23:14
Оценка:
Здравствуйте, 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;
            }

        };
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.