usar tipos metodos funciones funcion expresiones ejemplos delegados delegado como anonimos anonimas c# .net backgroundworker anonymous-methods

tipos - metodos anonimos c#



BackgroundWorker con métodos anónimos? (4)

Voy a crear un BackgroundWorker con un método anónimo.
He escrito el siguiente código:

BackgroundWorker bgw = new BackgroundWorker(); bgw.DoWork += new DoWorkEventHandler( () => { int i = 0; foreach (var item in query2) { .... .... } } );


Pero el delegado ''System.ComponentModel.DoWorkEventHandler'' no toma los argumentos ''0'' y tengo que pasar dos objetos al método anónimo: remitente del objeto, DoWorkEventArgs e

¿Podría por favor guiarme, cómo puedo hacerlo? Gracias.


Vamos a hacerlo simple

Las expresiones Lambda son realmente útiles para hacer el código más corto y más legible. Sin embargo, a los programadores de nivel de entrada les puede resultar un poco difícil tratar con ellos. Hay tres conceptos separados por los que se debe pasar: métodos anónimos, delegados y expresiones lambda. Un recorrido detallado de cada uno de ellos está fuera del alcance de esta respuesta. Espero que el ejemplo de código que se proporciona a continuación sirva para dar una vista rápida de los diferentes enfoques disponibles.

class TestBed { BackgroundWorker bgw = new BackgroundWorker(); void sample() { //approach #1 bgw.DoWork += new DoWorkEventHandler(bgw_DoWork); //DoWorkEventHandler is nothing but a readily available delegate written by smart Microsoft guys //approach #2, to make it a little shorter bgw.DoWork += (s,e) => { //... }; //this is called lambda expression (see the => symbol) //approach #3, if lambda scares you bgw.DoWork += delegate { //... (but you can''t have parameters in this approach }; //approach #4, have a helper method to prepare the background worker prepareBgw((s,e)=> { //... } ); //approach #5, helper along with a simple delegate, but no params possible prepareBgw(delegate { //... } ); //approach #6, helper along with passing the methodname as a delegate prepareBgw(bgw_DoWork); //approach #7, helper method applied on approach #1 prepareBgw(new DoWorkEventHandler(bgw_DoWork)); } void bgw_DoWork(object sender, DoWorkEventArgs e) { //... } void prepareBgw(DoWorkEventHandler doWork) { bgw.DoWork+= doWork; } }

Tenga en cuenta que en este ejemplo usamos "delegar" y no "delegar" (hay una diferencia entre las dos)


Si especifica un lambda, debe asegurarse de que toma el mismo número de argumentos:

bgw.DoWork += (s, e) => ...;

Pero si no está utilizando los argumentos, podría usar un delegado anónimo sin parámetros:

bgw.DoWork += delegate { ... };


Si has escrito lo anterior sin lambdas ¿cómo sería?

backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);

y el método nombrado:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { // Get the BackgroundWorker that raised this event. BackgroundWorker worker = sender as BackgroundWorker; // Assign the result of the computation // to the Result property of the DoWorkEventArgs // object. This is will be available to the // RunWorkerCompleted eventhandler. e.Result = ComputeFibonacci((int)e.Argument, worker, e); }

Pero ahora está utilizando lambdas sin variables enlazadas () => Debe proporcionar dos objetos remitente y e (que se deducirán del tipo más adelante).

backgroundWorker1.DoWork += (sender, e) => ...


Solo necesita agregar parámetros a la función anónima:

bgw.DoWork += (sender, e) => { ... }

O si no te importan los parámetros puedes simplemente:

bgw.DoWork += delegate { ... }