2010-11-16 36 views

Trả lời

37

Bạn có thể chỉ ra rằng các biến tĩnh nên được lưu trữ mỗi sợi sử dụng thuộc tính [ThreadStatic]:

[ThreadStatic] 
private static int foo; 
+0

Tôi có thể lưu trữ Danh sách các đối tượng tĩnh trên mỗi luồng với thuộc tính này không? –

+1

@DainiusKreivys Có! Bất kể loại biến là gì, cá thể duy nhất của nó sẽ được duy trì trên mỗi chuỗi miễn là bạn đang sử dụng thuộc tính '[ThreadStatic]'. Tôi đã làm một bài kiểm tra nhanh bằng cách sử dụng '[ThreadStatic] danh sách tĩnh riêng foo = new List {20, 30};'. Sau đó, trên một thread khác, tôi khởi tạo biến foo tương tự với một danh sách chứa ba số nguyên và khi chuỗi đó kết thúc danh sách gốc của tôi chứa hai phần tử được đề cập bởi chuỗi chính vẫn nguyên vẹn. – RBT

6

tùy chọn khác là phải vượt qua trong một tham số vào phương pháp chủ đề bắt đầu. Bạn sẽ cần phải giữ trong phạm vi, nhưng nó có thể được dễ dàng hơn để gỡ lỗi và duy trì.

15

Một tùy chọn khác trong trường hợp phạm vi đó là vấn đề bạn có thể sử dụng Số liệu được đặt tên theo số ví dụ:

//setting 
    LocalDataStoreSlot lds = System.Threading.Thread.AllocateNamedDataSlot("foo"); 
    System.Threading.Thread.SetData(lds, "SomeValue"); 

    //getting 
    LocalDataStoreSlot lds = System.Threading.Thread.GetNamedDataSlot("foo"); 
    string somevalue = System.Threading.Thread.GetData(lds).ToString(); 

Đây chỉ là một ý tưởng tốt nếu bạn không thể làm những gì James Kovacs và AdamSane mô tả

+0

không phải lo lắng, cảm ơn câu trả lời, nó đã giúp tôi thoát khỏi – NibblyPig

+2

Các khe dữ liệu được đặt tên có hoạt động với mô hình 'async Task' mới không? Có điều gì cần thiết để tạo một vị trí có sẵn trong nhiệm vụ không? – Jaans

47

Nếu bạn sử dụng Net 4.0 hoặc cao hơn, như xa như tôi biết, cách khuyến cáo là sử dụng System.Threading.ThreadLocal<T> cũng cho phép khởi tạo lười biếng làm tiền thưởng.

+6

Phương pháp này cũng không giới hạn ở các trường tĩnh. –

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