Cách tạo:
o Khai báo một phương thức chứa mã lệnh cần thực thi.
o Phương thức này phải trả về void và chỉ nhận một đối số.
o Tạo một thể hiện của ủy nhiệm System.Threading.WaitCallback tham chiếu đến phương thức này.
o Gọi phương thức tĩnh QueueUserWorkItem của lớp System.Threading.ThreadPool,
o Truyền thể hiện ủy nhiệm đã tạo làm đối số.
o Bộ thực thi sẽ xếp thể hiện ủy nhiệm này vào hàng đợi và thực thi nó khi một tiểu trình trong thread-pool sẵn sàng.
Ví dụ thực thi một phương thức có tên là DisplayMessage:
o Truyền DisplayMessage đến thread-pool hai lần
o Lần đầu không có đối số
o Lần sau có đối số là đối tượng MessageInfo
Chương trình ThreadPoolExample
using System;
using System.Threading;
// Lớp dùng để truyền dữ liệu cho phương thức DisplayMessage // khi nó được thực thi bằng thread-pool.
public class MessageInfo {
private int iterations; private string message;
// Phương thức khởi dựng nhận các thiết lập cấu hình cho tiểu trình. public MessageInfo(int iterations, string message)
{
this.iterations = iterations; this.message = message; }
// Các thuộc tính dùng để lấy các thiết lập cấu hình. public int Iterations { get { return iterations; } } public string Message { get { return message; } } }
public class ThreadPoolExample {
// Hiển thị thông tin ra cửa sổ Console.
public static void DisplayMessage(object state) {
//Ép đối số state sang MessageInfo.
MessageInfo config = state as MessageInfo;
//Nếu đối số config = null, không có đối số nào truyền cho phương thức ThreadPool.QueueUserWorkItem;
// sử dụng các giá trị mặc định. if (config == null)
{
// Hiển thị một thông báo ra cửa sổ Console ba lần. for (int count = 0; count < 3; count++)
{
Console.WriteLine("A thread-pool example."); // Vào trạng thái chờ, dùng cho mục đích minh họa. // Tránh đưa các tiểu trình của thread-pool
// vào trạng thái chờ trong các ứng dụng thực tế. Thread.Sleep(1000);
} }
else {
// Hiển thị một thông báo được chỉđịnh trước // với số lần cũng được chỉđịnh trước.
for (int count = 0; count < config.Iterations; count++) {
Console.WriteLine(config.Message);
// Vào trạng thái chờ, dùng cho mục đích minh họa. // Tránh đưa các tiểu trình của thread-pool
// vào trạng thái chờ trong các ứng dụng thực tế. Thread.Sleep(1000);
} }
}
public static void Main() {
// Tạo một đối tượng ủy nhiệm, cho phép chúng ta // truyền phương thức DisplayMessage cho thread-pool. WaitCallback workMethod = new
WaitCallback(ThreadPoolExample.DisplayMessage);
// Thực thi DisplayMessage bằng thread-pool (không có đối số). ThreadPool.QueueUserWorkItem(workMethod);
// Thực thi DisplayMessage bằng thread-pool (truyền một // đối tượng MessageInfo cho phương thức DisplayMessage).
MessageInfo info = new MessageInfo(5, "A thread-pool example with arguments.");
ThreadPool.QueueUserWorkItem(workMethod, info); // Nhấn Enter để kết thúc.
Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine();
} }
Tình huống sử dụng:
Khi một tiểu trình trong thread-pool sẵn sàng, nó nhận công việc kế tiếp từ hàng đợi và thực thi công việc này. Khi đã hoàn tất công việc, thay vì kết thúc, tiểu trình này quay về thread-pool và nhận công việc kế tiếp từ hàng đợi.
Việc sử dụng thread-pool giúp đơn giản hóa việc lập trình hỗ trợđa tiểu trình. Tuy nhiên, cần lưu ý khi quyết định sử dụng thread-pool, cần xem xét các điểm sau:
• Không nên sử dụng thread-pool để thực thi các tiến trình chạy trong một thời gian dài. Vì số
tiểu trình trong thread-pool là có giới hạn. Đặc biệt, tránh đặt các tiểu trình trong thread-pool vào trạng thái đợi trong một thời gian quá dài.
• Không thểđiều khiển lịch trình của các tiểu trình trong thread-pool, cũng như không thể thay
đổi độưu tiên của các công việc. Thread-pool xử lý các công việc theo thứ tự thêm chúng vào hàng đợi.