Oto stosunkowo częste zadanie dla mnie i, myślę, dla wielu programistów .NET:
Chcę używać .NET ThreadPool do planowania wątków roboczych, które muszą przetwarzać dany typ zadania.Generic ThreadPool in .NET
Jako odświeżające, podpisy dla metody kolejkowania z puli wątków i towarzyszące jej delegata są:
public static bool QueueUserWorkItem (
WaitCallback callBack,
Object state
)
public delegate void WaitCallback (Object state)
Dlatego typowy rodzajowy klasy nić pracownik będzie wyglądać następująco:
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
}
}
Zwróć uwagę na typ parametru state
? To jest Object
!
Jaki jest główny powód, dla którego zespół .NET zdecydował się nie generować metody QueueUserWorkItem
(lub całej klasy ThreadPool
)? Nie mogę uwierzyć, że po prostu to przeoczyli.
Oto jak chciałbym go zobaczyć:
//in the ThreadPool class:
public static bool QueueUserWorkItem<T> (
WaitCallback<T> callBack,
T state
)
public delegate void WaitCallback<T> (T state)
To uczyniłoby klasa pracownik typu bezpieczny (i dużo jaśniejsze, IMHO):
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
}
}
I musi być brakuje coś.
Nie rozumiem Twojego argumentu nie używając puli wątków jako podstawową „realizacja” warstwą kolejce pracy. Czy jest to problem podczas używania * the *.NET ThreadPool ze względu na ograniczoną liczbę wątków? IMO naturalne jest założenie, że zadania w kolejce pracy są krótkie. Czy mógłbyś to rozwinąć? –