2009-05-12 38 views
13

Tôi đang sử dụng biến ThreadStatic để lưu trữ một số dữ liệu, nhưng tôi lo lắng rằng dữ liệu tôi lưu trữ trên luồng sẽ vẫn ở đó sau khi tôi kết thúc với nó và phát hành trở lại ThreadPool. Tôi có cần phải lo lắng về việc xóa các biến ThreadStatic của mình trước khi kết thúc chuỗi không? Hoặc ThreadPool sẽ làm điều này cho tôi trước khi "chuyển nó ra" cho QueueUserWorkItem tiếp theo? Điều này đặc biệt quan trọng đối với tôi bởi vì tôi cần đảm bảo rằng các chuỗi khác trong ứng dụng của tôi có một phương tiện chặn hoạt động từ các biến ThreadStatic. Cảm ơn!Các giá trị trong các biến ThreadStatic của tôi có còn tồn tại khi đạp xe qua ThreadPool không?

Trả lời

12

Những hồ bơi thread (theo thiết kế) giữ đề sống giữa các cuộc gọi. Điều này có nghĩa là các biến ThreadStatic sẽ tồn tại giữa các cuộc gọi đến QueueUserWorkItem.

Hành vi này cũng là điều bạn không nên tính. ThreadPool sẽ (cuối cùng, theo quyết định của nó) phát hành các luồng lại và để chúng kết thúc, và xây dựng các luồng mới khi cần thiết.

Tuy nhiên, tôi muốn đặt câu hỏi về thiết kế của bạn nếu bạn đang gặp sự cố với điều này. Nếu bạn cần dữ liệu ThreadStatic xác định, cụ thể sẽ được sử dụng trong QueueUserWorkItem, các thói quen luồng của bạn có thể là các ứng cử viên tốt cho việc tự xử lý luồng. ThreadStatic và ThreadPool không phải lúc nào cũng là sự kết hợp tuyệt vời - bạn không nhất thiết phải có đủ quyền kiểm soát (vì ThreadPool quản lý các luồng) thực sự tận dụng và nhận được lợi ích từ các biến ThreadStatic. Bạn sẽ không bao giờ biết liệu hai mục công việc có nằm trên cùng một luồng, các luồng khác nhau hay không và liệu biến threadstatic có được khởi tạo lại hay không, v.v.

5

Tôi mong đợi họ sẽ duy trì giữa các phương pháp. Tất nhiên, nếu nghi ngờ, hãy thiết lập lại các biến thread-static khi bắt đầu phương thức công nhân của bạn. Hoặc sử dụng try/finally để xóa các giá trị sau mỗi mỗi đơn vị hoạt động.

(chỉnh sửa)

Thật dễ dàng để chứng minh rằng chúng thực sự vẫn còn; trên một cách nhanh chóng bắt đầu số in ấn cao hơn 0 (trong đó 0 mỗi lần là những gì chúng ta mong chờ nếu người lao động khác nhau được phân lập):

[STAThread] 
static void Main() 
{ 
    for (int i = 0; i < 50; i++) 
    { 
     ThreadPool.QueueUserWorkItem(DoStuff); 
    } 
    Console.ReadLine(); 
} 
static void DoStuff(object state) 
{ 
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": " + value++); 
    Thread.Sleep(20); 
} 
[ThreadStatic] 
static int value; 
Các vấn đề liên quan