Re[3]: запуск по таймеру
От: eos  
Дата: 26.01.11 15:07
Оценка: +1
Здравствуйте, Lloyd, Вы писали:

L>
L>public static class FunctionalHelpers
L>{
L>    public static Action<T> OnceInTime<T>(Action<T> action)
L>    {
L>        bool isRuning = false;
L>        return t =>
L>        {
L>            if (isRuning)
L>                return;

L>            try
L>            {
L>                isRuning = true;
L>                action(t);
L>            }
L>            finally
L>            {
L>                isRuning = false;
L>            }

L>        };
L>    }
L>}

L>


Что-то мне подсказывает, что Ваш метод не потокобезопасен. Я бы предложил немного другую реализацию:

int isRuning = 0;
return t =>
{
    if (Interlocked.CompareExchange(isRuning, 1, 0) == 1)
        return;

    try
    {
        action(t);
    }
    finally
    {
        Interlocked.Exchange(1, 0);
    }
};


Поправьте если не прав.

P.S. писал в браузере, так что могут быть ошибки в коде, но смысл постарался сохранить
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.