Самый простой способ сделать целое метод потокобезопасный?

Кажется, есть много чего узнать о многопоточном программировании, и все это немного пугает.

Для моих текущих нужд я просто хочу защитить от повторного вызова метода из другого потока до его завершения, и мой вопрос:

Это адекватный (безопасный) способ сделать потокобезопасный метод?

class Foo
{
    bool doingWork;
    void DoWork()
    {
        if (doingWork)  // <- sophistocated thread-safety
            return;     // <-

        doingWork = true;

        try
        {
            [do work here]
        }
        finally
        {
            doingWork = false;
        }
    }
}

Если этого недостаточно, каков самый простой способ добиться этого?


РЕДАКТИРОВАТЬ: Дополнительная информация о сценарии:

  • Существует только один экземпляр Foo

  • Foo .DoWork () будет вызываться из потока ThreadPool в Elapsed событие System.Timers.Timer.

  • Обычно Foo.DoWork () завершает эоны до того, как в следующий раз называется, но я хочу написать код для малой вероятности, что он будет работать долго, и мне позвонят еще раз, прежде чем закончить.


(Я также недостаточно умен, чтобы быть уверенным, что этот вопрос может быть помечен как независимый от языка, поэтому я этого не сделал. Просветленные читатели, не стесняйтесь делать это, если это возможно.)

9
задан Igby Largeman 29 July 2011 в 22:29
поделиться