none
TASK ASYNC funciona en aplication c# pero no en web form 4.5.2 RRS feed

  • Pregunta

  • Hola buenas, estoy tratando de usar la siguiente librería:

    https://github.com/thabofletcher/CSharp.IPInfoDB

    Que sirve para obtener la GEOLOCALIZACIÓN. El caso es que si ejecuto la DEMO de dicho proyecto, me funciona y me obtiene bien los datos de ip, pero el problema es cuando me lo intento llevar a mi aplicación WEBFORM C# 4.5.2.

    Cuando llama al método:

    await GetLocation<CityLocationModel>(CITY_PATH + _ApiKey + "&ip=" + ip);

    Se que da pensando y ya no devuelve ni TIMEOUT ni nada.

    WEBFORM 4.5 o mayor si permite la utilización de llamadas asíncronas no?, hay que configurar algo en el iis o algo?

    No se porque pasa esto.

    Un saludo.

    miércoles, 22 de junio de 2016 9:13

Respuestas

  • Tiene truco: Para que funcione el async en un WebForm tienes que ponerle en el @Page el parámetro async="true".

    <%@ Page Async="true" Title="..." Language="C#".... %>

    Y luego para ejecutar la llamada asíncrona, tienes que usar RegisterAsyncTask como en este ejemplo:

           protected void Page_Load(object sender, EventArgs e)
            {
                RegisterAsyncTask(new PageAsyncTask(LoadCustomersAsync));
            }
    
            private async Task LoadCustomersAsync()
            {
                Business.Customers blCustomers = new Business.Customers();
                IEnumerable<Communication.Customer> customers = await blCustomers.GetCustomersAsync();
                gvCustomers.DataSource = customers;
                gvCustomers.DataBind();
            }
    

    jueves, 23 de junio de 2016 19:00

Todas las respuestas

  • hola

    en que contexto usas esa linea de codigo?

    donde asignas las cordenadas que este metodo deberia retornar?

    si usas async/await puede que lances la llamada a la libreria pero el codigo continue ejecutando y devuelva la respuesta al cliente y este no termine de devolver una respuesta

    si pones un breakpoint en el codigo puedes evaluar si continua la ejecucion despues de devolver la repsuesta al browser

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    miércoles, 22 de junio de 2016 12:58
  • Buenas Leandro.

    Me bajo la DLL de CSharp.IPInfoDB, si ejecuto la DEMO que viene en el proyecto Github funciona correctamente, pero al meter la referencia en mi proyecto

    y poner en mi master page, para probarlo:

            var consumer = new CSharp.IPInfoDB.ApiConsumer(key, true);
    
            var model = consumer.GetCity("63.75.190.1");
    
            if (model.statusCode == "ERROR")
    ...

    pero al llegar a la linea donde realiza la llamada a consumer.GetCity(ip); se queda pensando y no pasa a la siguiente línea y ya no vuelve, no pasa al if donde comprueba si da ERROR.

    Lo que no entiendo la diferencia que hay entre ejecutarlo en la aplicación de consola que si que devuelve el error o la información si es correcta y luego realizando exactamente lo mismo pero en una app webform no realice la devolución de datos.

    saludos




    jueves, 23 de junio de 2016 6:41
  • He realizado lo que comentas del breakpoint, y realiza todo correctamente, y cuando realiza el

    return FixCase<T>(model);
    Me fijo y ha recuperado el model correctamente, pero con el return pierdo el seguimiento, y se queda pensando y ya no vuelve para insertar el valor en la variable que espera la respuesta, y se queda pensando.

    jueves, 23 de junio de 2016 7:31
  • Tiene truco: Para que funcione el async en un WebForm tienes que ponerle en el @Page el parámetro async="true".

    <%@ Page Async="true" Title="..." Language="C#".... %>

    Y luego para ejecutar la llamada asíncrona, tienes que usar RegisterAsyncTask como en este ejemplo:

           protected void Page_Load(object sender, EventArgs e)
            {
                RegisterAsyncTask(new PageAsyncTask(LoadCustomersAsync));
            }
    
            private async Task LoadCustomersAsync()
            {
                Business.Customers blCustomers = new Business.Customers();
                IEnumerable<Communication.Customer> customers = await blCustomers.GetCustomersAsync();
                gvCustomers.DataSource = customers;
                gvCustomers.DataBind();
            }
    

    jueves, 23 de junio de 2016 19:00
  • Ahhh! voy a probar y comentaré o marcaré como respuesta según me vaya. ¡Pero muchísimas gracias!, ya andaba volviendome loco.

    Gracias! ;D

    viernes, 24 de junio de 2016 7:05