2009-02-18 30 views
10

Các chủ đề nền tảng có được sử dụng lại không?Bộ nhớ cục bộ có tồn tại giữa các lời gọi nền không?

Cụ thể, nếu tôi đặt khe dữ liệu có tên (lưu trữ cục bộ) trong phương thức DoWork() của nền, giá trị của vùng dữ liệu đó vẫn tồn tại, có khả năng tìm thấy chuỗi khác sau này ?

tôi sẽ không có suy nghĩ như vậy, nhưng tôi có lỗi này ...

EDIT: This blog post gợi ý rằng BackGroundWorker sử dụng một ThreadPool, mà ngụ ý rằng Chủ đề tái sử dụng. Cho nên câu hỏi trở thành; thế nào để sử dụng lại các chủ đề có khả năng tồn tại thread-local lưu trữ giữa invocations?

Trả lời

7

Khi nhóm chủ đề sử dụng lại một chuỗi, nó không xóa dữ liệu trong lưu trữ cục bộ luồng hoặc trong các trường được đánh dấu bằng thuộc tính ThreadStaticAttribute. Do đó, dữ liệu được đặt trong lưu trữ cục bộ luồng bằng một phương thức có thể được tiếp xúc với bất kỳ phương thức nào khác được thực hiện bởi cùng một luồng thread thread. Một phương thức truy cập một trường được đánh dấu bằng thuộc tính ThreadStaticAttribute có thể gặp phải các dữ liệu khác nhau tùy thuộc vào luồng thread pool nào thực thi nó.

nguồn: http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

0

Cần kiểm tra nguồn (hoặc qua Reflector) để xác định điều này nếu nó không được chỉ định trong MSDN.

Nếu không được chỉ định, bạn không thể dựa vào hành vi hiện tại không thay đổi trong phiên bản .NET sau này.

Chỉnh sửa: Có vẻ như đang sử dụng nhóm chủ đề, do đó, các chủ đề sẽ được sử dụng lại.

4

Vâng, nội BackgroundWorker đang sử dụng BeginInvoke có nghĩa là (I tin) mà nó đang sử dụng một trong những chủ đề từ ThreadPool. Như để nếu TLS được xóa khi chủ đề được trả về hồ bơi, tôi không thể nói chắc chắn.

Để trả lời chỉnh sửa, không có gì tôi thấy trong Trình phản chiếu cho thấy các khe TLS bị xóa hoặc giải phóng khi đã quay trở lại hồ bơi. Vì vậy, bạn phải xóa chúng một cách rõ ràng trước khi trả về phương thức DoWork của bạn.

+2

TLS không được xóa khi thread trở lại chủ hồ bơi "Khi các hồ bơi thread reuses một chủ đề, nó không rõ ràng sẽ dữ liệu trong chủ đề lưu trữ cục bộ hoặc trong Vì vậy, khi một phương thức kiểm tra luồng lưu trữ cục bộ hoặc các trường được đánh dấu bằng thuộc tính ThreadStaticAttribute, các giá trị mà nó tìm thấy có thể bị bỏ sót từ việc sử dụng luồng thread thread trước đó. " 'NGUỒN: [liên kết] (http://msdn.microsoft.com/enus/library/system.threading.threadpool.aspx)' – Taher

Các vấn đề liên quan