Dudas básicas sobre Delegados.

06/02/2004 - 11:26 por Pedro Nuñez Morgades | Informe spam
Hola, quisiera saber qué utilidad tienen los delegados,
he leido que sirven para tareas de notificación y están
relacionados con los eventos.

Por ejemplo, si tengo una función que recibe un delegado,
siempre tengo que pasarle el delegado, es decir, no puedo
pasarle null de alguna forma para indicar que no quiero
hacer nada ?.

public void DelegadoImplementacion ( string parametro )
{ ...}

MiFuncionQueRecibeUnDelegado(unParametro,
new MiDelegate( DelegadoImplementacion ) );

Es decir, cuando hago new MiDelegate(...) no se puede
pasar null para indicar que no quuiero tratar la
notificación.


Otra cosa, si estoy en ASP.NET y tengo un proceso muy
largo y quuiero notificar cada cierto tiempo cŽŽomo va el
proceso, indicándolo en una barra de progreso, por
ejemplo. Cómo se podría hacer...?

En una aplicación Windows sería sencillo pero en ASP.NET
es más complicado, porque cómo llamo al servidor para que
refresque la página y a la vuelta siga con el proceso.

Atentamente,
 

Leer las respuestas

#1 Felipe Arcos Velez
06/02/2004 - 18:47 | Informe spam
Hola Pedro,

Bueno, tienes varias preguntas en una sola solicitud, seria bueno que la
proxima vez colocaras cada pregunta en una solicitud independiente, creo que
de esa manera es mas facil que te respondan.

1. Delegados: Es cierto que los delegados se los emplea como un mecanismo de
notificacion, y tambien es cierto que estan relacionados con los eventos,
hasta tal punto, que la implementacion de eventos en .net se basa en los
delegados.

Una aplicacion muy importante de los delegados, es la de permitir
especificar rutinas de ejecucion independientes del codigo que las va a
utilizar, es decir: un desarrollador diseña un metodo A que requiere cierta
logica para funcionar, por diseño y flexiblidad, el desarrollador decide que
dicha logica sea especificada como parametro en el momento que otro
desarrollador quiera utilizar el metodo A, esto se emplea mucho en .NET, por
ejemplo, la clase Thread, cuando tu creas una instancia de esta clase,
necesitas indicar cual es la rutina que se va a ejecutar en el hilo que
estas creando, la manera de indicar dicha rutina es utilizando delegados, ya
que el constructor de la clase Thread acepta un parametro de tipo
ThreadStart, el cual es un delegado.

2. Si puedes pasar null cuanto te piden un delegado.

3. te recomiendo te leas el siguiente articulo, es muy completo y te da una
opcion para lo que buscas (Te lo estoy enviando asi porque creo que el
enlace al articulo original ya no esta disponible).

UI Tip

LANGUAGES: VB .NET

ASP.NET VERSIONS: 1.0 | 1.1


Make a Progress Indicator For Slow-Loading Pages

Create a pop-up status page that lets your users know they're not forgotten.


By Brad McCabe


One problem with ASP.NET is that keeping the user informed about the status
of a long running task is difficult. When a page that takes time to load is
posted to the server, the user often is left wondering whether the
application is responding or if their request even made it to the server.
I'll give you a simple tip that provides the user a basic status screen to
provide them better feedback.


First, create a basic page that asks a user for their name and provides them
a button to submit the page. The code behind the button is pretty simple:


Response.Redirect("EndPage.aspx?name=" & Name.Text)


Next, create a simple page that sleeps the thread for 10 seconds to simulate
a long running process. After the thread wakes up, the page updates a label
to welcome the user. The code looks like this:


System.Threading.Thread.Sleep(10000)

Label1.Text = "Welcome " & Request.QueryString("Name") & "!"


If you run these two pages, you'll find that when you click on the submit
button, the browser sits on the start page for 10 seconds without any
feedback to the user. Now modify the start-page code to redirect to an
intermediary loading page. This page provides your end user with visual
notification that the application is processing their request. Here's the
new code behind on the submit button:


Dim URL As String = "EndPage.aspx?name=" & Name.Text

Response.Redirect("Loading.Aspx?Page=" & URL)


The previous code now captures the original URL and passes it on the query
string to the loading page, Loading.Aspx. The loading page then displays to
the user a status message while loading the requested page.


First, start by creating a basic message for your user:


<table border="0" cellpadding="0" cellspacing="0"

width="99%" height="99%" align="center"

valign="middle">

<tr>

<td align="center" valign="middle">

<font color="Red" size="5">


<span id="Message">Loading&nbsp;--

Please Wait</span>

<span id="Progress" style="WIDTH:25px;

TEXT-ALIGN:left"></span>

</font>

</td>

</tr>

</table>


Inside the table at the middle of the screen, you want to display a message
to the user. You'll use JavaScript's Progress span tag here to update the
screen and inform the user that the application is responding.


Now that the screen is set up, you need to hook up the JavaScript to make
the page work using the client-side onLoad and onUnload events:


<body onload="BeginPageLoad()" onunload="EndPageLoad()">


When the page is loaded, your custom BeginPageLoad function is fired.
BeginPageLoad has two lines of JavaScript:


location.href = "<%= Request.QueryString("Page")%>";

iIntervalId = window.setInterval("iLoopCounter
UpdateProgress(iLoopCounter, iMaxLoop)", 500);


The first line of code starts the loading processes for the requested page.
After the page has been requested from the server, a call to the
UpdateProgress function starts a timer that updates the screen. This
function uses the Progress span tag and displays five dots in succession.
When the fifth dot is added, the span is cleared and the process starts
over. Once the new page is finished loading, it is rendered immediately for
the user and the EndPageLoad function will be processed. The EndPageLoad
function then performs some basic clean-up and notifies the user if the
transfer fails or an error occurs:


window.clearInterval(iIntervalId);

Progress.innerText = "Page Loaded -- Not Transferring";


As you can see, you need only a few lines of JavaScript to provide the user
with visual notification that their request has been submitted and is being
processed. By providing the user with this feedback, you can help eliminate
the possibility that the user will cancel the page request and attempt to
resubmit the page or hit the submit button repeatedly, possibly corrupting
your data or bringing down the application.


Suerte,

Felipe A.

"Pedro Nuñez Morgades" wrote in
message news:b82901c3ec9b$abcbc4d0$
Hola, quisiera saber qué utilidad tienen los delegados,
he leido que sirven para tareas de notificación y están
relacionados con los eventos.

Por ejemplo, si tengo una función que recibe un delegado,
siempre tengo que pasarle el delegado, es decir, no puedo
pasarle null de alguna forma para indicar que no quiero
hacer nada ?.

public void DelegadoImplementacion ( string parametro )
{ ...}

MiFuncionQueRecibeUnDelegado(unParametro,
new MiDelegate( DelegadoImplementacion ) );

Es decir, cuando hago new MiDelegate(...) no se puede
pasar null para indicar que no quuiero tratar la
notificación.


Otra cosa, si estoy en ASP.NET y tengo un proceso muy
largo y quuiero notificar cada cierto tiempo c´´omo va el
proceso, indicándolo en una barra de progreso, por
ejemplo. Cómo se podría hacer...?

En una aplicación Windows sería sencillo pero en ASP.NET
es más complicado, porque cómo llamo al servidor para que
refresque la página y a la vuelta siga con el proceso.

Atentamente,

Preguntas similares