Hier ist eine relativ häufige Aufgabe für mich, und ich denke, für viele. NET-Programmierer: Ich möchte mit dem .NET ThreadPool für die Planung von Worker-Threads, die einen bestimmten Typ von verarbeiten müssen Aufgaben.Generic ThreadPool in. NET
als Auffrischung, sind die Unterschriften für die Warteschlangenverfahren des Threadpools und die damit verbunden Delegierten:
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
}
}
:
public static bool QueueUserWorkItem (
WaitCallback callBack,
Object state
)
public delegate void WaitCallback (Object state)
Daher ist eine typische Klasse generic Worker-Thread etwas aussehen würde, Beachten Sie den Typ des state
Parameters? Es ist Object
!
Was ist der zwingende Grund, warum das .NET-Team entschied, die QueueUserWorkItem
-Methode (oder die gesamte ThreadPool
-Klasse) generisch zu machen? Ich kann nicht glauben, dass sie es einfach übersehen haben.
Hier ist, wie ich möchte es sehen:
//in the ThreadPool class:
public static bool QueueUserWorkItem<T> (
WaitCallback<T> callBack,
T state
)
public delegate void WaitCallback<T> (T state)
dies der Arbeiter Klasse typsicher machen würde (und viel klarer, 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 fehlen darf etwas.
Ich verstehe nicht, Ihr Argument keinen Thread-Pool als Underlying Execution Schicht einer Arbeitswarteschlange verwenden. Ist das ein Problem bei der Verwendung von * the *?NET ThreadPool Klasse aufgrund der begrenzten Anzahl von Threads dort? Es ist normal anzunehmen, dass Aufgaben in einer Arbeitswarteschlange kurz sind. Kannst du bitte etwas ausarbeiten? –