これは、私にとって、そして多くの .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)
これにより、ワーカークラスがタイプセーフになります(そして、より明確になります、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
}
}
私は何かが欠けているに違いない。