es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo refactorizar ‘lock’ a ‘async/await’?

Tenemos una biblioteca antigua escrita en C# para targeting framework 2.0. Recientemente, vamos a utilizarla en un proyecto moderno de .net core y tenemos la intención de utilizar async/await. Sin embargo, la biblioteca antigua tiene muchos bloques de lock.

Planeamos agregar nuevos métodos async para implementar la misma lógica.

Por ejemplo,

el código antiguo

void GetOrder()
{
// …
lock(_lock)
{
//…
}
}

resultado esperado

async Task AsyncGetOrder()
{
// …
await DoSomethingWithLock()
}

Por favor, dame algunos consejos sobre cómo traducir lock en async/await.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La mejor manera de traducir lock en async/await es utilizando la clase SemaphoreSlim. Esta clase proporciona una manera segura de hilos para limitar la cantidad de hilos que pueden acceder a un recurso o grupo de recursos concurrently.

    Por ejemplo, se puede utilizar el método WaitAsync para adquirir el semáforo y el método Release para liberarlo:

    private SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
    
    async Task AsyncGetOrder()
    {
        // ...
        await _semaphore.WaitAsync();
        try
        {
            // ...
        }
        finally
        {
            _semaphore.Release();
        }
    }
    

Comments are closed.