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
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.
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;
- 1. đi xe đạp qua các giá trị trong hộp danh sách MS Access
- 2. Visual Studio: Đi xe đạp qua các điểm ngắt
- 3. Đi xe đạp qua nội dung của vấn đề mảng
- 4. Các biến lười biếng có tồn tại trong Clojure không?
- 5. Không thay đổi web.config khi không có giá trị nào tồn tại cho một biến đổi
- 6. Phím tắt Geany để đi xe đạp thông qua các đề xuất đối số
- 7. Có thể bỏ qua các tập tin không tồn tại, không có chủng tộc?
- 8. listen() bỏ qua giá trị tồn đọng
- 9. Chủ đề lạ NullReferenceException khi đọc giá trị tồn tại?
- 10. Các đối tượng trong PHP có được chuyển qua giá trị hoặc tham chiếu không?
- 11. Tại sao các quá trình sinh ra bởi cron kết thúc không còn tồn tại?
- 12. SimpleXML - "Nút không còn tồn tại"
- 13. Làm thế nào để so sánh các biến không xác định, nếu tôi không biết chúng có tồn tại không?
- 14. Actionscript3: Biến có tồn tại không?
- 15. Khi đóng Scala, khi nào các biến bắt được bắt đầu tồn tại trên vùng JVM?
- 16. Khai báo các biến không có giá trị
- 17. WebKit Âm thanh biến dạng trên iOS 6 (iPhone 5) lần đầu tiên sau khi đi xe đạp điện
- 18. Loại Tham gia nào để xem các giá trị không tồn tại trong bảng Tham gia?
- 19. Đi qua các giá trị giữa nhà chế biến tại camel apache
- 20. Tại sao Firefox không vượt qua tất cả các sự kiện bánh xe chuột vào ứng dụng javascript của tôi?
- 21. Sao chép các tập tin trong khi bỏ qua các tập tin tồn tại - Unix
- 22. Tôi có thể chỉ định biến nào tôi muốn tồn tại sau khi hoàn thành việc chờ tiếp tục không?
- 23. Có sự xuống cấp hiệu suất khi chúng tôi LUÔN LUÔN sử dụng các loại giá trị không có giá trị thay vì các loại giá trị không?
- 24. Python: Gán Giá trị nếu Không tồn tại
- 25. Perl: Tôi có thể lưu trữ backreferences (không phải giá trị của chúng) trong các biến không?
- 26. Thay đổi giá trị của các biến trong các phương thức, Java
- 27. Tôi cần một tùy chọn đổ cây, không còn tồn tại trong phiên bản gcc hiện tại
- 28. Mảng PHP với giá trị mặc định cho các chỉ mục không tồn tại
- 29. Tại sao các biến cục bộ có các giá trị ban đầu
- 30. Tạo bộ nhớ cache trong bộ nhớ còn tồn tại giữa các lần thực hiện