Tôi đang sử dụng nhiều luồng trong ứng dụng của tôi bằng cách sử dụng vòng lặp (true) và bây giờ tôi muốn thoát khỏi vòng lặp khi tất cả các chủ đề đang hoạt động hoàn thành công việc của họ.Làm thế nào để bạn xác định xem các chủ đề con đã hoàn thành
Trả lời
Bạn có thể sử dụng Process.GetCurrentProcess(). Threads.Count.
Giải pháp Process.GetCurrentProcess(). Threads.Count không hoạt động. Nó trả về tất cả các tiến trình đang chạy nhưng tôi cần đếm các luồng chạy mà tôi đã tạo trong ứng dụng của mình. –
Process.GetCurrentProcess() Threads.Count thực sự trả về số luồng cho quá trình hiện tại, nếu bạn cần đếm tất cả các luồng của tất cả các tiến trình bạn cần lặp lại quy trình suy nghĩ trong ứng dụng của bạn – Anonymous
Điều đó cũng sẽ liên quan đến luồng thread. Mặc dù bạn có thể nhận được số đếm trước khi tạo chuỗi nhưng vẫn không đảm bảo rằng chuỗi chủ đề tùy chỉnh của bạn bị chấm dứt khi số lượng giảm. – ata
Có cách tiếp cận khác nhau ở đây, nhưng utlimately nhất trong số họ đi xuống để thay đổi đề thi của bạn để làm một cái gì đó bất cứ khi nào họ rời khỏi (thành công hay qua ngoại lệ, mà bạn không muốn làm anyway). Một cách tiếp cận đơn giản có thể là sử dụng Interlock.Decrement
để giảm số lượt truy cập - và nếu đó là số không (hoặc -ve, có thể là lỗi), hãy giải phóng một đối tượng ManualResetEvent
hoặc Monitor.Pulse
; trong cả hai trường hợp, chủ đề gốc sẽ đợi trên đối tượng đó. Một số cách tiếp cận như vậy là discussed here.
Tất nhiên, có thể dễ dàng xem xét các bit TPL trong 4.0, cung cấp nhiều tùy chọn mới ở đây (không phải những thứ như Parallel.For
trong PLINQ).
Nếu bạn đang sử dụng hàng đợi công việc đã đồng bộ hóa, bạn cũng có thể đặt hàng đợi đó để đóng (thoát) chính nó và chỉ cần đợi hàng đợi trống? Giả định ở đây là các chuỗi công nhân của bạn đang làm một việc gì đó như:
T workItem;
while(queue.TryDequeue(out workItem)) { // this may block until either something
ProcessWorkItem(workItem); // todo, or the queue is terminated
}
// queue has closed - exit the thread
trong trường hợp này, hàng đợi trống rỗng, tất cả các chuỗi công nhân của bạn phải đang trong quá trình tự sát.
Giả sử rằng bạn có danh sách các chủ đề, đây là hai cách tiếp cận.
Giải pháp đầu tiên:
Sử dụng Thread.Join() với một tham số khoảng thời gian để đồng bộ với mỗi chủ đề lần lượt. Giá trị trả lại cho bạn biết liệu luồng đã kết thúc hay chưa.
Giải pháp thứ hai:
Kiểm tra Thread.IsAlive() để xem các chủ đề vẫn chạy.
Trong cả hai trường hợp, đảm bảo rằng chuỗi chính của bạn mang lại thời gian xử lý cho các chuỗi đang chạy, vòng lặp chờ của bạn sẽ tiêu thụ hầu hết/tất cả CPU và làm hỏng luồng công nhân của bạn.
Trong trường hợp Join, thread gọi phương thức Join sẽ đợi cho nó trở lại. Trong trường hợp Thread.IsAlive, bạn sẽ phải thăm dò một số thời gian cụ thể (như 1 giây). Nó sẽ giống như gọi phương thức Join, chuỗi gọi sẽ phải chờ cho đến khi tất cả các luồng kết thúc. Sử dụng tốt hơn Thread.Join() – ata
Sự khác biệt chính là việc bỏ phiếu IsAlive() cho phép chủ đề chính của bạn tiếp tục thực hiện công việc khác, nếu có. Điểm tốt mặc dù - nếu không có việc phải làm, Join() là lựa chọn hiệu quả hơn. – Bevan
Bạn có thể sử dụng Thread.Join()
. Phương thức Join
sẽ chặn chuỗi gọi cho đến khi chuỗi (phương thức mà phương thức Join
được gọi) chấm dứt.
Vì vậy, nếu bạn có danh sách chuỗi, bạn có thể lặp lại và gọi Join
trên mỗi chuỗi. Bạn vòng lặp sẽ chỉ thoát khi tất cả các chủ đề đã chết. Một cái gì đó như thế này:
for(int i = 0 ;i < childThreadList.Count; i++)
{
childThreadList[i].Join();
}
///...The following code will execute when all threads in the list have been terminated...///
Tôi thấy rằng việc sử dụng phương thức Join() là cách sạch nhất. Tôi sử dụng nhiều chủ đề thường xuyên, và mỗi luồng thường tải dữ liệu từ các nguồn dữ liệu khác nhau (Informix, Oracle và SQL cùng một lúc.) Một vòng lặp đơn giản, như đã đề cập ở trên, gọi Join() trên mỗi đối tượng thread (mà tôi lưu trữ một đối tượng List đơn giản) hoạt động !!!
Carlos Merighe.
Tôi thích sử dụng một HashSet of Threads:
// create a HashSet of heavy tasks (threads) to run
HashSet<Thread> Threadlist = new HashSet<Thread>();
Threadlist.Add(new Thread(() => SomeHeavyTask1()));
Threadlist.Add(new Thread(() => SomeHeavyTask2()));
Threadlist.Add(new Thread(() => SomeHeavyTask3()));
// start the threads
foreach (Thread T in Threadlist)
T.Start();
// these will execute sequential
NotSoHeavyTask1();
NotSoHeavyTask2();
NotSoHeavyTask3();
// loop through tasks to see if they are still active, and join them to main thread
foreach (Thread T in Threadlist)
if (T.ThreadState == ThreadState.Running)
T.Join();
// finally this code will execute
MoreTasksToDo();
- 1. Đối với pthread, Làm thế nào để giết chủ đề con từ chủ đề chính
- 2. Xác định khi stringByEvaluatingJavaScriptFromString đã hoàn tất
- 3. Đợi các chủ đề được gộp lại để hoàn thành
- 4. Làm thế nào để loại bỏ các đề nghị hoàn
- 5. Làm thế nào để xác định các chủ đề trong Eclipse Debug Perspective?
- 6. Xác định thời điểm video đã hoàn thành bộ đệm
- 7. Xác định xem một websocket gửi() có hoàn thành
- 8. Xác định xem mdworker (Spotlight) đã hoàn thành lần quét đầu tiên
- 9. Làm thế nào để xác định liệu cây nhị phân có hoàn thành?
- 10. Làm thế nào để bạn xem các tệp EOT webfont?
- 11. Làm thế nào để xác định xem lắp ráp đã được ngen'd?
- 12. C#: Đang đợi tất cả các chủ đề hoàn thành
- 13. Làm thế nào để chương trình số lượng các chủ đề của bạn trong Delphi
- 14. Xem tất cả biến đã xác định
- 15. Làm thế nào để bạn xác định Kích thước lô hàng ADO.NET được đề xuất trong thế giới thực?
- 16. Làm thế nào để bạn xác định xem địa chỉ IP là riêng tư, bằng Python?
- 17. Làm thế nào để xác định xem kênh từ xa đã được đăng ký
- 18. Làm thế nào để AppDomain.Unload() hủy bỏ các chủ đề?
- 19. Chủ đề: Cách bắt đầu lại chuỗi khi hoàn thành?
- 20. Làm cách nào để xác định xem tính toán đã được hoàn thành hay phát hiện tính toán bị gián đoạn?
- 21. Làm thế nào để sử dụng các biến đã được xác định trong ConfigParser
- 22. Sao chép quyền/xác thực vào chủ đề con ...?
- 23. Làm thế nào để biết hoạt động đã được hoàn thành?
- 24. Làm thế nào để bạn xác định khi Windows được thực hiện khởi động lại?
- 25. Làm thế nào để hoàn thành một mốc?
- 26. Làm cách nào để thay đổi hoàn thành lịch sử bash để hoàn thành những gì đã có trên dòng?
- 27. Bạn có xem Terracotta là sản phẩm hoàn thiện không?
- 28. Làm cách nào để bạn xác định phần cứng cần thiết cho máy chủ?
- 29. Làm thế nào để xử lý chủ đề C# WPF trong mô hình xem MVVM
- 30. Làm cách nào để xác định xem hình ảnh đã được tạo ảnh?
Không hoàn toàn khác nhau từ câu hỏi này & trả lời: http://stackoverflow.com/questions/435668/code-for-a-simple-thread-pool -in-c – xcud
Vòng lặp của bạn như thế nào? Bạn đang sử dụng nó để tạo chủ đề? Hay bạn đang sử dụng nó để chờ các chủ đề hoàn thành nhiệm vụ? – ata