Tôi có một máy chủ HTTP mà tôi đang viết bằng cách sử dụng trình nghe HTTP và tôi muốn khai báo một số biến nhất định khi có thể truy cập từ bất kỳ đâu trong chuỗi.Đặt một biến toàn cầu trong một luồng - C#
- Lớp máy chủ web của tôi được dựa trên nền tảng, vì vậy tôi không thể sử dụng biến tĩnh.
- Tôi có thể sử dụng biến mẫu vì tất cả mã đều nằm trong một lớp, nhưng ... Tôi không biết.
Tôi đã nghĩ đến việc sử dụng từ điển: Dictionary</*[type of Thread ID here]*/,ThreadData>
, nhưng tôi lo ngại có thể có vấn đề về luồng. ThreadData
sẽ có lẽ là một phiên bản lớp, nhưng tôi có thể sử dụng cấu trúc, tùy thuộc vào đó sẽ hiệu quả hơn.
- Nếu tôi sẽ chìa khóa từ điển cho các ID chủ đề và chương trình nó để một thread sẽ chỉ yêu cầu nhập riêng của mình trong từ điển, sẽ có bất kỳ vấn đề chủ đề liên quan đến khi truy cập vào từ điển?
- Mỗi chuỗi sẽ thêm mục nhập của riêng nó. Tôi có phải khóa từ điển trong khi thêm các mục mới không? Nếu vậy, tôi có thể sử dụng một đối tượng khóa riêng biệt để cho phép các luồng truy cập dữ liệu của riêng chúng trong thời gian chờ đợi không?
Có lợi thế nào khi sử dụng từ điển đồng thời không? Có cách nào khác an toàn hơn không?
Tôi hiện đang sử dụng ThreadPool.QueueUserWorkItem
. Tôi không biết chắc chắn rằng điều này sử dụng một chủ đề mới cho mỗi mục. Nếu không thì tôi cũng có thể đưa nó vào ngữ cảnh.
Cập nhật: Theo ThreadPool class - MSDN, nó sẽ sử dụng lại các chuỗi. Và nó không xóa dữ liệu luồng.
Khi nhóm chủ đề sử dụng lại chuỗi, nó không xóa dữ liệu trong lưu trữ cục bộ luồng hoặc trong trường được đánh dấu bằng thuộc tính ThreadStaticAttribute. Do đó, khi một phương thức kiểm tra lưu trữ cục bộ luồng 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 đó.
Các bạn đã thử subclassing [BackgroundWorker] (http://msdn.microsoft.com/en- lớp us/library/system.componentmodel.backgroundworker.aspx)? – Romoku
Bởi vì bạn có một điểm vào riêng biệt cho các chuỗi công nhân của bạn và bạn tự viết logic công nhân, nó không phải là một vấn đề để bạn xóa sạch dữ liệu luồng cũ. – Gene