Đây là một nhiệm vụ tương đối phổ biến đối với tôi, và, tôi nghĩ, đối với nhiều lập trình viên .NET:
Tôi muốn sử dụng .NET ThreadPool để lập lịch trình các luồng công nhân cần xử lý một kiểu đã cho nhiệm vụ.Generic ThreadPool trong .NET
Là một bồi dưỡng, chữ ký cho phương pháp xếp hàng của ThreadPool và đại biểu liên quan của nó là:
public static bool QueueUserWorkItem (
WaitCallback callBack,
Object state
)
public delegate void WaitCallback (Object state)
Do đó, một chung lớp sợi nhân điển hình sẽ giống như thế:
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
}
}
Lưu ý loại tham số state
? Đó là Object
!
Lý do thuyết phục tại sao nhóm .NET đã chọn không thực hiện phương thức QueueUserWorkItem
(hoặc toàn bộ lớp ThreadPool
) chung? Tôi không thể tin rằng họ chỉ bỏ qua nó.
Đây là cách tôi muốn nhìn thấy nó:
//in the ThreadPool class:
public static bool QueueUserWorkItem<T> (
WaitCallback<T> callBack,
T state
)
public delegate void WaitCallback<T> (T state)
Điều này sẽ làm cho các loại an toàn giai cấp công nhân (và rất nhiều rõ ràng hơn, 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
}
}
tôi phải mất một cái gì đó.
Tôi không hiểu đối số của bạn về việc không sử dụng nhóm luồng làm lớp 'thực thi' cơ bản của hàng đợi công việc. Đây có phải là vấn đề khi sử dụng * the *.NET ThreadPool lớp do số lượng hạn chế của chủ đề đó? IMO nó tự nhiên để giả định nhiệm vụ trong một hàng đợi công việc là ngắn. Bạn có thể vui lòng xây dựng? –