He aquí una tarea relativamente común para mí, y creo que para muchos programadores de .NET:
Quiero utilizar .NET ThreadPool para programar subprocesos de trabajo que necesitan procesar un tipo determinado de Tareas.Generic ThreadPool en .NET
A modo de recordatorio, las firmas para el método de puesta en cola de ThreadPool y su delegado asociado son:
public static bool QueueUserWorkItem (
WaitCallback callBack,
Object state
)
public delegate void WaitCallback (Object state)
Por lo tanto, una clase subproceso de trabajo genérico típico sería algo como:
public class Worker<T> {
public void schedule(T i_task) {
ThreadPool.QueueUserWorkItem(execute, i_task)
}
private void execute(Object o){
T task = (T)o; //What happened to the type safety?
executeTask(task);
}
private void executeTask(T i_task){
//process i_task
}
}
Observe el tipo del parámetro state
? ¡Es Object
!
¿Cuál es la razón de peso por la cual el equipo de .NET eligió no hacer que el método QueueUserWorkItem
(o la clase completa ThreadPool
) sea genérico? No puedo creer que simplemente lo hayan pasado por alto.
Así es como me gustaría verlo:
//in the ThreadPool class:
public static bool QueueUserWorkItem<T> (
WaitCallback<T> callBack,
T state
)
public delegate void WaitCallback<T> (T state)
Esto haría que la clase trabajadora de tipo seguro (y mucho más claro, en mi humilde opinión):
public class Worker<T> {
public void schedule(T i_task) {
ThreadPool.QueueUserWorkItem<T>(execute, i_task)
}
private void execute(T i_task){
//process i_task
}
}
Debo estar perdiendo alguna cosa.
No entiendo el argumento de no utilizar un grupo de subprocesos como la capa subyacente de 'ejecución' de una cola de trabajo. ¿Es esto un problema cuando se usa * the *.NET clase ThreadPool debido a la cantidad limitada de subprocesos allí? OMI es natural suponer que las tareas en una cola de trabajo son cortas. ¿Puedes por favor elaborar? –