2011-12-21 31 views
5

Chương trình của tôi tạo một số chủ đề cho một số tác vụ.ManagedThreadID không phải là duy nhất?

Mã của tôi là như thế này:

Dictionary<int, double> threadStates = new Dictionary<int, double>(); 
for (int i = 0; i < SubNNs.Count(); i++) 
{ 
    Thread tt = new Thread(StartTrainingSubs); 
    threadStates.Add(tt.ManagedThreadId, 0); 
    tt.Priority = ThreadPriority.Highest; 
    tt.Start(i); 
} 

Nhưng đôi khi, nếu SubNNs.Count() trở nên lớn (10-20), Chương trình ném ngoại lệ này: "Một mục với cùng một chìa khóa đã được thêm vào" tại dòng threadStates.Add(tt.ManagedThreadId, 0);

Tại sao tôi đưa ra lỗi này? Không phải là ManagedThreadId duy nhất? Nếu có, tôi nên làm gì?

và Nếu không, có thể luồng hoàn tất và một chuỗi khác bắt đầu bằng cùng một ManagedThreadId? Có thể không? làm thế nào để ngăn chặn vấn đề này?

Hoặc có sự cố khác?

EDIT: Người dùng cho biết rằng ManagedThreadId có thể được sử dụng lại. Vì vậy, vì trong các phần sau của mã, mỗi thread cần phải biết chính nó với một số duy nhất, có cách nào để thêm một cái gì đó giống như một tên cho thread mà mỗi thread có thể nhận được số duy nhất của nó?

Cảm ơn bạn đã thông báo!

+3

Có, ID luồng được tái chế. –

Trả lời

6

Nếu không, có thể luồng hoàn tất và chuỗi khác bắt đầu bằng cùng ManagedThreadId? Có thể không? làm thế nào để ngăn chặn vấn đề này?

Có. ID luồng được quản lý có thể được sử dụng lại. Chúng không phải là một lựa chọn tốt cho khóa trạng thái từ điển.

Thay vì sử dụng ID luồng để theo dõi trạng thái, bạn nên cân nhắc sử dụng một số giá trị duy nhất khác. Trong trường hợp của bạn, "i" là duy nhất trên mỗi vòng lặp - tại sao không sử dụng nó làm khóa của bạn?

+0

Cảm ơn. "i" là duy nhất, đúng vậy. nhưng trong một phần khác của mã, mỗi thread cần phải biết chính nó, mỗi thread biết ManagedThreadId của nó, nhưng không phải về "i". –

+0

Tôi có thể đặt tên giống như tên cho mọi chuỗi không? Vì vậy, mỗi thread có thể xác định chính nó? –

+1

@Mahdi Bạn cần ID luồng cho mục đích gì? Bạn có thể chuyển thông tin đến một khởi đầu của luồng - bạn đang làm điều đó ngay bây giờ ('tt.Start (i);') Chỉ cần vượt qua trạng thái mà bạn yêu cầu. Nếu bạn cần một mã định danh duy nhất, hãy chuyển một mã này vào trong thường trình ParameterizedThreadStart ở phía trước. –

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