2012-06-12 20 views
5

¿Tengo la certeza de que la única forma de evitar que un método se ejecute dos veces al mismo tiempo es usando una instrucción lock?impedir que el método se ejecute desde diferentes subprocesos al mismo tiempo

private object lockMethod = new object(); 

public void Method() { 
    lock (lockMethod) { 
     // work 
    } 
} 

public void FromThread1() { 
    Method(); 
} 

public void FromThread2() { 
    Method(); 
} 

Por supuesto, también se puede utilizar MethodImpl(MethodImplOptions.Synchronized) lo que sería casi lo mismo.

¿Hay otras técnicas?

+7

Estoy un poco preocupado de que estés tratando de bloquear un _method_ en lugar de bloquear _data_ - ¿qué problema estás tratando de resolver? – sarnold

+0

Dado que no muestra ningún método 'estático', ¿realmente está tratando de evitar la ejecución de un método dos veces para la misma instancia al mismo tiempo? ¿O dos métodos para una sola instancia al mismo tiempo? – HABO

+0

el método es tan pequeño que en mi situación bloqueando el método = bloqueando los datos – javapowered

Respuesta

9

¿Tengo la certeza de que el único método para evitar que el método se ejecute dos veces al mismo tiempo es usar la instrucción de bloqueo?

No, pero esta es la forma "estándar", y probablemente la mejor. Dicho eso, normalmente usaría un candado para sincronizar el acceso a datos específicos, no a un método en su conjunto. Bloquear un método completo probablemente causará más bloqueo de lo necesario.

En cuanto a otros métodos, el espacio de nombres System.Threading contiene muchos otros tipos utilizados para la sincronización en varias formas, incluyendo ReaderWriterLockSlim, Semaphore, Mutex, la Monitor class (que es lo lock utiliza internamente), etc. Todos proporcionan diversas formas de sincronizar datos , aunque cada uno está orientado para un escenario diferente. En este caso, lock es el método apropiado para usar.

Cuestiones relacionadas