Programación asíncrona

25/09/2003 - 16:30 por grbyte | Informe spam
Hola a todos,

Tengo un problema con una Aplicación Web. Esta Aplicación
Web hace una llamada a un Web Service (tarda unos
segundos) y mientras se hace esa llamada la pantalla se
me queda en blanco. Querría hacer que pusiese PROCESANDO
DATOS... o algo similar. Para ello tengo que saber cuando
tengo listos los datos y cómo sacar el mensaje.

Lo he probado con las llamadas asíncronas a Web Services
pero no he logrado nada que funcione.

Si alguien me puede pasar un código de algo parecido se
lo agradecería (o en su defecto alguna dirección donde
expongan un ejemplo de este tipo).

Antes de nada muchas gracias.

Preguntas similare

Leer las respuestas

#1 SqlRanger
26/09/2003 - 11:37 | Informe spam
No me parece sencillo el problema. De todas maneras te voy a proponer una
solución un poco enrevesada, la verdad es que no se me ha ocurrido nada
mejor.

La idea es: en vez de llamar directamente a la página que muestra la
información y llama al servicio web, llamémosla Datos.aspx, llamar a una
página Procesando.aspx. Esta página muesta al usuario el aviso "Procesando"
, tan bonito como quieras, con un gif animado o lo que sea. Dicha página
llama a la página Datos.aspx cuando termina de cargarse en el navegador
mediante JavaScript de cliente, . Como hasta que el navegador no empieza a
recibir HTML del servidor no borra el contenido de la página mostrada
anteriormente, obtenemos el efecto deseado. Normalmente la página Datos.aspx
requerirá que se le pasen parámetros, por ejemplo en una QueryString, así
que le pasamos a Datos.aspx la misma QueryString que ha recibido
Procesando.aspx. Más o menos el HTML de Procesando sería algo así

<HEAD>
<title>Procesando</title>
<meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" content="Visual Basic .NET 7.1">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema"
content="http://schemas.microsoft.com/intell...">
<script language=javascript>
function OnPageLoad()
{
window.navigate("Datos.aspx<%= "?"&Page.Request.QueryString("Var") %>" );
}
</script>
</HEAD>

<body MS_POSITIONING="GridLayout" onload="OnPageLoad()">


En la página Datos.aspx ya no es necesario hacer llamadas asíncronas al
servicio web, a no ser que se pudieran hacer otras cosas al mismo tiempo
mientras se termina la llamada al servicio.



Saludos:

Jesús López
MVP Microsoft .NET
MCP SQL Server
Respuesta Responder a este mensaje
#2 grbyte
26/09/2003 - 17:28 | Informe spam
Muchas gracias SqlRanger,

he probado el truco y funciona muy bien. Para mi es muy
util y no caía en algo de este estilo.

Adiós y gracias
Respuesta Responder a este mensaje
#3 grbyte
29/09/2003 - 12:54 | Informe spam
Hola otra vez SqlRanger,

He hecho algunas pruebas y algo me falla.

Si la página PROCESANDO que me propones es una ASPX
(procesando.aspx), puedo recoger con un
REQUEST.QUERYSTRING("URL") la página que tengo que abrir,
pero entonces la pantalla no se repinta hasta que
devuelva los datos, osea que no pone "procesando..."

Por el contrario si hago que la página PROCESANDO sea
HTML (procesando.html), sale bien el mensaje
de "procesando..." pero no puedo coger de ninguna forma
la URL de la página de datos.

Se te ocurre alguna solución.

Gracias.


No me parece sencillo el problema. De todas maneras te


voy a proponer una
solución un poco enrevesada, la verdad es que no se me


ha ocurrido nada
mejor.

La idea es: en vez de llamar directamente a la página


que muestra la
información y llama al servicio web, llamémosla


Datos.aspx, llamar a una
página Procesando.aspx. Esta página muesta al usuario el


aviso "Procesando"
, tan bonito como quieras, con un gif animado o lo que


sea. Dicha página
llama a la página Datos.aspx cuando termina de cargarse


en el navegador
mediante JavaScript de cliente, . Como hasta que el


navegador no empieza a
recibir HTML del servidor no borra el contenido de la


página mostrada
anteriormente, obtenemos el efecto deseado. Normalmente


la página Datos.aspx
requerirá que se le pasen parámetros, por ejemplo en una


QueryString, así
que le pasamos a Datos.aspx la misma QueryString que ha


recibido
Procesando.aspx. Más o menos el HTML de Procesando sería


algo así

<HEAD>
<title>Procesando</title>
<meta name="GENERATOR" content="Microsoft Visual


Studio .NET 7.1">
<meta name="CODE_LANGUAGE" content="Visual Basic .NET


7.1">
<meta name="vs_defaultClientScript"


content="JavaScript">
<meta name="vs_targetSchema"
content="http://schemas.microsoft.com/intell...">
<script language=javascript>
function OnPageLoad()
{
window.navigate("Datos.aspx<%


= "?"&Page.Request.QueryString("Var") %>" );
}
</script>
</HEAD>

<body MS_POSITIONING="GridLayout" onload="OnPageLoad()">


En la página Datos.aspx ya no es necesario hacer


llamadas asíncronas al
servicio web, a no ser que se pudieran hacer otras cosas


al mismo tiempo
mientras se termina la llamada al servicio.



Saludos:

Jesús López
MVP Microsoft .NET
MCP SQL Server


.

Respuesta Responder a este mensaje
#4 SqlRanger
30/09/2003 - 09:35 | Informe spam
Yo he hecho pruebas con Procesando.aspx y Datos.aspx y me ha funcionado
correctamente, así que no sé qué decirte, puesto que no puedo reproducir la
condición de funcionamiento de la que me hablas.

Quizá si mandaras en un archivo adjunto el archivo aspx y su página de
código subyacente podría ayudarte. Mándalo en un zip.



Saludos:

Jesús López
MVP Microsoft .NET
MCP SQL Server
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida