Principales respuestas
TASK ASYNC funciona en aplication c# pero no en web form 4.5.2

Pregunta
-
Hola buenas, estoy tratando de usar la siguiente librería:
https://github.com/thabofletcher/CSharp.IPInfoDBQue 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.
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(); }
- Propuesto como respuesta José De AlvaModerator lunes, 27 de junio de 2016 16:55
- Marcado como respuesta José De AlvaModerator lunes, 27 de junio de 2016 16:58
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- Editado Leandro TuttiniMVP miércoles, 22 de junio de 2016 12:59
-
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
-
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.
-
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(); }
- Propuesto como respuesta José De AlvaModerator lunes, 27 de junio de 2016 16:55
- Marcado como respuesta José De AlvaModerator lunes, 27 de junio de 2016 16:58
-