Toda aplica????o web que trabalhamos raramente pensamos na quantidade de acessos que s??o realizados simultaneamente em um determinado trecho de c??digo. Um exemplo cl??ssico ?? uma vari??vel de contador de acessos/visitantes. Armazenamos o valor inicialmente em uma vari??vel de aplica????o. Depois quando um usu??rio acessa, ?? incrementado em 1. S?? que se ao mesmo tempo acessar dois ou mais usu??rios, eles podem capturar o mesmo valor ou valor defasado e colocar a contagem errada. Veja o exemplo abaixo:
Quando tivemos o acesso simult??neoparalelo, o valor capturado da vari??vel da aplica????o foi colhido pelos dois usu??rios e o valor armazenado foi comprometido. Para isso devemos bloquear o acesso ?? vari??vel de aplica????o e permitir apenas um usu??rio por vez executar a soma. Nesse caso, pode-se utilizar o seguinte trecho:
try
{
Application.Lock();
lock (this)
{
// Trecho a ser executado que altera uma vari??vel de aplica????o ou bloco cr??tico
}
Application.UnLock();
}
catch
{
Application.UnLock();
}
O Application.Lock() ir?? bloquear o acesso de outros usu??rios ??s vari??veis de aplica????o e depois o Application.UnLock() libera. O lock (this) permitir?? apenas o acesso de um ??nico usu??rio por vez no trecho de c??digo cr??tico. A combina????o dos dois m??todos depende muito do que estiver fazendo. Cada caso tem seu respectivo uso. O simples uso do lock (this) pode resolver… Ele ?? muito usado para evitar deadlocks. No mais, s?? isso. Recomendo dar uma lida posteriormente nos artigos abaixo:
- Lock Statment – MSDN
- Problemas no uso de Application.Lock() e Application.UnLock() – MSDN
- Deadlock – Technet
- Apresentando o objeto Application – Marcoratti