2011-07-11 8 views
8

Ahora mismo tengoCuál es la práctica estándar para comenzar una tarea con múltiples parámetros

class MyParamClass 
{ 
    all the parameters I need to pass to the task 
} 

MyParamClass myParamObj = new MyParamClass(); 
myParamObj.FirstParam = xyz; 
myParamObj.SecondParam = abc; 
mytask = new Task<bool>(myMethod, myParamObj,_cancelToken); 
mytask.Start() 

bool myMethod(object passedMyParamObj) 
{ 
    MyParamClass myParamObj = passedMyParamObj as MyParamClass; 
    //phew! finally access to passed parameters 
} 

¿Hay alguna forma de hacer esto sin tener la necesidad de crear MyParamClass clase? ¿Cómo puedo pasar múltiples params a una tarea sin este malabarismo? ¿Es esta la práctica estándar? gracias

+0

lo que hace el 'pfx' tienen que ver con la pregunta ... sólo curiosidad – IAbstract

+0

Haga clic en este enlace y búsqueda de http://en.wikipedia.org/wiki/Parallel_Extensions PFX Me estoy perdiendo algo? gracias – Gullu

+0

no ... No me di cuenta de que PFX está compuesto por * both * TPL y PLinq. – IAbstract

Respuesta

9

Usted puede hacer esto con una lambda o en línea delegado:

myTask = new Task<bool>(() => MyMethod(xyz, abc), _cancelToken); 
+0

que es mucho más limpio. Supongo que cuando tenga un gran número de params iré con lo que tengo y para una lista más pequeña usaré su enfoque para la legibilidad. gracias – Gullu

+0

Si su hallazgo tiene muchos parámetros, también trato de refactorizar todo el código para la tarea en otra clase, paso los parámetros a través del constructor o Propiedades y luego tengo un DoWhateverAsync() que devuelve la Tarea. No siempre es tan fácil de hacer, pero por lo general vale la pena intentarlo. –

+1

Este enfoque es fácil de leer, y es conveniente ya que básicamente hace que el compilador construya la clase param detrás de las escenas. Solo tenga cuidado de no tener problemas con el acceso a cierres modificados, que es un riesgo que su enfoque original no tenía. –

5

El uso de una clase contenedora de manejar es la manera estándar de hacer esto. Lo único que puede hacer es usar Tuple para evitar escribir MyParamClass.

mytask = new Task(myMethod, Tuple.Create(xyz, abc), _cancelToken); 
mytask.Start(); 

bool myMethod(object passedTuple) 
{ 
    var myParamObj = passTuple as Tuple<int, string>; 
} 
+0

Es bueno saber sobre la tupla. Solo lee sobre esto. Upvoted. Gracias – Gullu

Cuestiones relacionadas