none
llamar metodo asincronico RRS feed

  • Pregunta

  • Hola como va ?. Tengo la siguiente duda debo llamar un método asincronico en un metodo index, pero no logro hacerlo, el metodo que necesito llamar es:

     var user = this.userHelper.GetUserByIdAsync(id);
    Lei que debo cambiar el metodo asincronico, pero viene de la clase usermanager y no puedo cambiarlo. Mi pregunta es como puedo llamarlo, porque luego de eso necesito traer un campo de la variable user. Desde ya gracias.

    domingo, 5 de abril de 2020 14:10

Todas las respuestas

  • Coloca el cursor encima y pulsa F12 para ir a la definición. Comprueba si está declarado como Task. Esto no es seguro; aunque hay una convención para ponerles el sufijo "Async" a los métodos que implementan tareas asíncronas, Microsoft también tiene unos cuantos métodos terminados en Async que en realidad lo que hacen es disparar un evento cuando terminan. Así que solo con ver el nombre no es suficiente, necesitamos que nos enseñes la definición del método.

    Si fuera un async Task, lo puedes llamar con "await":

    var user = await this.userHelper.GetUserByIdAsync(id);

    Pero esto no funcionará si es del otro tipo.

    Ah, y para usar el await necesitas que el método de acción esté marcado como async.


    domingo, 5 de abril de 2020 14:56
  • Coloca el cursor encima y pulsa F12 para ir a la definición. Comprueba si está declarado como Task. Esto no es seguro; aunque hay una convención para ponerles el sufijo "Async" a los métodos que implementan tareas asíncronas, Microsoft también tiene unos cuantos métodos terminados en Async que en realidad lo que hacen es disparar un evento cuando terminan. Así que solo con ver el nombre no es suficiente, necesitamos que nos enseñes la definición del método.

    Si fuera un async Task, lo puedes llamar con "await":

    var user = await this.userHelper.GetUserByIdAsync(id);

    Pero esto no funcionará si es del otro tipo.

    Ah, y para usar el await necesitas que el método de acción esté marcado como async.


    Hola Alberto, Gracias por tu respuesta en la interfaz y en la clase tengo lo siguiente

    public async Task<User> GetUserByIdAsync(string userId)
            {
                return await this.userManager.FindByIdAsync(userId);
            }
    
    Task<User> GetUserByIdAsync(string userId);

    y al método Index cuando lo hago async me devuelve error hace la lectura de una carpeta

    public IActionResult Index(string path)
            {
                /////////////////////////////////////////////////
                
                var folderPath = _hostingEnvironment.ContentRootPath + "\\Folder\\";
                 
    
                var realPath = folderPath + path;
    
                if (System.IO.File.Exists(realPath))
                {
                    var fileBytes = System.IO.File.ReadAllBytes(realPath);
    
                    //http://stackoverflow.com/questions/1176022/unknown-file-type-mime
                    return File(fileBytes, "application/force-download");
                }
                else if (System.IO.Directory.Exists(realPath))
                {
                    List<DirModel> dirListModel = MapDirs(realPath);
    
                    List<FileModel> fileListModel = MapFiles(realPath);
    
                    ExplorerModel explorerModel = new ExplorerModel(dirListModel, fileListModel);
    
                    
                    if (realPath.Last() != '/' && realPath.Last() != '\\')
                    { explorerModel.URL = "/Explorer/" + path + "/"; }
                    else
                    { explorerModel.URL = "/Explorer/" + path; }
    
                    var request = _httpContextAccessor.HttpContext.Request;
    
                    UriBuilder uriBuilder = new UriBuilder
                    { Path = request.Path.ToString() };
    
                    
                    explorerModel.FolderName = WebUtility.UrlDecode(uriBuilder.Uri.Segments.Last());
    
                   
                    Uri uri = new Uri(uriBuilder.Uri.AbsoluteUri.Remove
                                        (uriBuilder.Uri.AbsoluteUri.Length - uriBuilder.Uri.Segments.Last().Length));
    
                    explorerModel.ParentFolderName = uri.AbsolutePath;
    
                    return View(explorerModel);
                   
                }
                else
                {
                    return Content(path + " is not a valid file or directory.");
                }
            }
    Dentro de la carpeta folder tengo subcarpetas con un nombre por cada usuario logeado y lo que quiero hacer ahora es que agregar a \\Folder\\ + user.Name para que accedan a esa carpeta.

    domingo, 5 de abril de 2020 15:10
  • y al método Index cuando lo hago async me devuelve error hace la lectura de una carpeta

    No creo que el hacerlo asíncrono tenga nada que ver con la lectura de la carpeta, ya que no hay en ésta nada que sea asíncrono. Debe haber algún otro problema en esa lectura. No digas nunca "me devuelve error". Siempre hay que decir cuál es el error, copiando el mensaje exacto, completo y detallado, y la línea de código exacta en la que ocurre.

    lunes, 6 de abril de 2020 7:54
  • hola

    >>al método Index cuando lo hago async me devuelve error hace la lectura de una carpeta

    Cual es exactamente el mensaje de error ? no tu traduccion o intepretacion del error, sino cual es el texto que lees

    Ademas dentro de Index() no veo que invoques a GetUserByIdAsync(), como puede estar fallando por ese metodo async sino lo aplicas?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 6 de abril de 2020 11:54
  • Hola Leandro, el método lo puse al principio y lo quite en el método index es este

    var user = this.userHelper.GetUserByIdAsync(id);

    luego estuve probando esta solución

    var userId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.Name).Value;
                
    
                var folderPath = _hostingEnvironment.ContentRootPath + "\\Folder\\" + userId + "\\";
    y esta funcionando lo que pude ver es que si queda la sesión abierta el userId queda null, lo que quiero decir es que cuando recarga la pagina y esta logeada no me toma el usuario y el error anterior que daba cuando ejecutaba era asi
      if (string.IsNullOrEmpty(id))
                {
                    return NotFound();
                }
    
                var user = this.userHelper.GetUserByIdAsync(id);
                if (user == null)
                {
                    return NotFound();
                }

    An unhandled exception occurred while processing the request.

    InvalidOperationException: The view 'Error404' was not found. The following locations were searched:
    /Views/Home/Error404.cshtml
    /Views/Shared/Error404.cshtml
    /Pages/Shared/Error404.cshtml

    Microsoft.AspNetCore.Mvc.ViewEngines.ViewEngineResult.EnsureSuccessful(IEnumerable<string> originalLocations)



    lunes, 6 de abril de 2020 19:33
  • hola

    >>InvalidOperationException: The view 'Error404' was not found. The following locations were searched

    pero ese mensaje no tiene nada que ver con los asincrono que mencionas

    esta queriendo encontrar una view que no has creado, quizas sea porque usas

    return NotFound();

    al pasar por alli espera que tengas esa view en Shared o Home

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 7 de abril de 2020 12:53
  • hola

    >>InvalidOperationException: The view 'Error404' was not found. The following locations were searched

    pero ese mensaje no tiene nada que ver con los asincrono que mencionas

    esta queriendo encontrar una view que no has creado, quizas sea porque usas

    return NotFound();

    al pasar por alli espera que tengas esa view en Shared o Home

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Hola Perdon por la demora, me quede sin pc por un tiempo voy a revisar lo que me dices y probare, gracias
    viernes, 8 de mayo de 2020 13:10