2014-06-06 14 views
7

Sau khi tìm kiếm các câu hỏi về Stack Overflow và một số googling, tôi vẫn chưa nhận được.Nhận chủ đề chạy theo tên từ ProcessThreadCollection

Tôi biết rằng bạn có thể kiểm tra xem một chuỗi có đang chạy với phương thức "Thread.isAlive()" không, nhưng tôi muốn kiểm tra xem "FooThread" cụ thể vẫn đang chạy giữa tất cả các chuỗi đang chạy từ quá trình hiện tại hay không và nếu không, hãy gọi phương thức khởi động nó.

//somewhere in the code, on another Project/DLL inside solution 
private void FooThreadCaller() 
{ 
    Action act =() => fooFunction(); 
    Thread t = new Thread(new ThreadStart(act)); 
    t.Name = "FooThread"; 
    t.Start(); 
} 
//... 
Process proc = System.Diagnostics.Process.GetCurrentProcess(); 
ProcessThreadCollection threads = proc.Threads; 
bool ThreadExists = false 
foreach (ProcessThread item in threads) 
{ 
    // if item.Name == "FooThread", then ThreadExists = true... 
    // so, if !ThreadExists then call FooThreadCaller() and so on. 
} 
//... 

Kể từ khi lớp ProcessThread không có một "Tên" tài sản (như System.Threading.Thread không) nhưng chỉ ID, và tôi chỉ biết tên chủ đề ("FooThread ") không phải là ID, làm thế nào tôi có thể kiểm tra xem" FooThread "đang chạy/còn sống?

Cảm ơn bạn trước

+1

Thậm chí nếu điều này là có thể, nó sẽ không là một ý tưởng tốt. Nếu luồng chỉ đang trong quá trình thoát, bạn sẽ thấy nó vẫn đang chạy. Điều này vốn đã rất hiếu kỳ. Tự mình theo dõi thông tin này. Khi FooThread tắt, làm cho không. Khi nó bắt đầu, hãy ghi chú. – usr

+2

Bạn đang làm điều gì đó rất, rất sai. Bất kỳ "là một thread vẫn chạy thử nghiệm" là vô dụng, nó có thể không được chạy một nano giây sau đó. Điều tốt nó không hoạt động. –

+2

Đây là những nhận xét tuyệt vời, nhưng cũng đáng để chỉ ra rằng OP thực sự kiểm tra xem chuỗi có * không * đang chạy hay không. – Slider345

Trả lời

5

Như đã đề cập trong các câu trả lời khác, các đối tượng ProcessThread và Thread là khác nhau. Dll của bạn đang tạo ra đối tượng Thread của nó, nhưng sau đó nó ném đi nó tham chiếu đến đối tượng đó. Sau đó, sau đó bạn đang truy vấn hệ điều hành (thông qua System.Diagnostics) cho chuỗi đó và mong đợi cùng một cấp truy cập mà bạn đã có trước đây với tư cách là người tạo luồng.

Thay vào đó, bạn nên lưu các tham chiếu đến đối tượng Thread của mình khi bạn tạo chúng. Có lẽ dll của bạn có thể thực hiện một đối tượng bộ sưu tập tĩnh công cộng mà sau đó bạn sẽ thêm các đối tượng luồng của mình vào khi bạn tạo chúng.

Sau đó, bên ngoài dll của bạn, bạn có thể lặp qua bộ sưu tập và kiểm tra tên và trạng thái của mỗi Chủ đề.

+1

Cảm ơn bạn @ Slider345. Tôi sẽ kiểm tra điều này. –

2

Tôi không nghĩ có cách nào để làm điều đó. A ProcessThread đại diện cho chuỗi OS. A Thread đại diện cho một luồng được quản lý bên trong ứng dụng của bạn. Thực sự không có mối quan hệ nào giữa hai người. Hơn nữa, ánh xạ của ThreadProcessThread KHÔNG phải là 1: 1, như trong, ProcessThread có thể đại diện cho nhiều Thread s.

3

ProcessThread đại diện cho một luồng cấp hệ điều hành, trong khi Thread đại diện cho chuỗi được quản lý .Net. Chuỗi cấp hệ điều hành không có tên nhưng là một ID duy nhất (giống như một quy trình).

Thay vì kiểm tra trong danh sách chuỗi hiện tại nếu chuỗi của bạn vẫn đang chạy, có thể bạn nên thay đổi logic của mã. Ví dụ, bạn có thể giữ một boolean chứa trạng thái luồng của bạn và cập nhật nó khi nó bắt đầu/kết thúc.