Вот довольно распространенная задача для меня, и, как мне кажется, для многих программистов .NET:
Я хочу использовать .NET ThreadPool для планирования рабочих потоков, которые должны обрабатывать задачи определенного типа.
В качестве переподготовки подписи для метода очередей ThreadPool и связанного с ним делегата:
public static bool QueueUserWorkItem (
WaitCallback callBack,
Object state
)
public delegate void WaitCallback (Object state)
Следовательно, типичный класс рабочих потоков общего вида будет выглядеть примерно так:
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
}
}
Обратите внимание на тип параметра state
? Это Object
!
Какая убедительная причина, по которой команда .NET решила не делать метод QueueUserWorkItem
(или весь класс ThreadPool
) универсальным? Я не могу поверить, что они просто упустили это из виду.
Вот как бы я хотел это увидеть:
//in the ThreadPool class:
public static bool QueueUserWorkItem<T> (
WaitCallback<T> callBack,
T state
)
public delegate void WaitCallback<T> (T state)
Это сделало бы рабочий класс безопасным для типов (и намного понятнее, ИМХО):
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
}
}
Я должен что-то упустить.