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.

Crear una función async await utilizando delegates en C#.

Tengo los siguientes delegados que necesito convertir a async await.

Mi delegado:

public delegate bool GetUserFromAccessTokenHandler(string token, out User user);

public GetUserFromAccessTokenHandler GetUserFromAccessToken;

public FunctionalOperations(IUnitOfWork unitOfWork)
{
      GetUserFromAccessToken = new GetUserFromAccessTokenHandler(GetUserFromAccessTokenFunction);
      _unitOfWork = unitOfWork;
}

Ahora necesito agregar async al método GetUserFromAccessTokenFunction, pero ocurre un error:

private async bool GetUserFromAccessTokenFunction (string token, out User user)
{
     var x = await _unitOfWork.User.Get(...);
}

Los dos errores que obtengo son:

1) La llamada es ambigua entre los siguientes métodos o propiedades: 'GetUserFromAccessTokenFunction' y 'GetUserFromAccessTokenFunction'

2) El tipo de retorno de un método async debe ser void, Task o Task<T>

¿Cómo puedo corregir la declaración de mi delegado para que se adapte a mis necesidades?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para hacer que el delegado sea asíncrono, debes modificarlo para que acepte un método asíncrono como su objetivo, y su tipo de retorno debería ser Task<bool> en lugar de bool. Así es como puedes actualizar tu código:

    public delegate Task<bool> GetUserFromAccessTokenHandler(string token, out User user);
    
    public GetUserFromAccessTokenHandler GetUserFromAccessToken;
    
    public FunctionalOperations(IUnitOfWork unitOfWork)
    {
        GetUserFromAccessToken = new GetUserFromAccessTokenHandler(GetUserFromAccessTokenFunction);
        _unitOfWork = unitOfWork;
    }
    
    private async Task<bool> GetUserFromAccessTokenFunction(string token, out User user)
    {
        // hacer algún trabajo asíncrono
        user = await _unitOfWork.User.Get(...);
    
        // devuelve un resultado booleano
        return user != null;
    }
    

    Con esta modificación, el código debería compilar sin errores. Ahora puedes usar el delegado así:

    csharp
    User user;
    bool result = await GetUserFromAccessToken(token, out user);

Comments are closed.