Vâng, câu trả lời OO sẽ là giữ danh sách chủ đề dưới dạng một trường.
private readonly List<Thread> threads = new List<Thread>();
Và sau đó thêm chuỗi mới được tạo vào danh sách trong trình xử lý đầu tiên.
var thread = new Thread(myfunc);
thread.Start();
threads.Add(thread);
Sau đó, bạn có thể lặp qua từng chuỗi trong trình xử lý thứ hai, hủy từng bước trong số đó.
foreach(var thread in threads)
thread.Abort();
Nhưng tôi nghĩ rằng điều quan trọng nhất ở đây là có hầu như không bao giờ một lý do chính đáng để gọi Thread.Abort
.
Từ MSDN page:
Khi một cuộc gọi đề Abort trên chính nó, tác dụng tương tự như ném một ngoại lệ ; ThreadAbortException xảy ra ngay lập tức và kết quả là có thể dự đoán được. Tuy nhiên, nếu một chuỗi cuộc gọi Hủy bỏ trên một chủ đề khác, hãy hủy hủy bỏ ngắt bất kỳ mã nào là đang chạy. Ngoài ra, cũng có khả năng một trình tạo tĩnh có thể bị hủy bỏ. Trong một số ít trường hợp, điều này có thể ngăn chặn trường hợp của lớp đó từ được tạo trong miền ứng dụng đó. Trong .NET Framework phiên bản 1.0 và 1.1, cơ hội có thể hủy trong khi khối cuối cùng là đang chạy, trong trường hợp này là khối cuối cùng là bị hủy.
Các chủ đề mà các cuộc gọi Abort sức mạnh khối nếu chủ đề đó đang được hủy bỏ là trong một khu vực được bảo vệ của mã, chẳng hạn như một khối catch, cuối cùng khối, hoặc hạn chế thực hiện khu vực. Nếu chuỗi gọi Abort giữ khóa mà chủ đề bị hủy bỏ yêu cầu, có thể xảy ra bế tắc.
Bạn sẽ sử dụng một số dạng tín hiệu tốt hơn, chẳng hạn như đặt ManualResetEvent
mà mỗi luồng sẽ thăm dò theo khoảng thời gian perioidic. Ngoài ra, bạn có thể sử dụng lớp BackgroundWorker
có một số hỗ trợ để hủy tác vụ (gọi CancelAsync
trên đó và nhận các chuỗi công nhân để kiểm tra định kỳ CancellationPending
). Nếu bạn đang sử dụng .NET 4.0, bạn cũng có thể sử dụng TPL.
Có lý do nào khiến bạn không thể sử dụng BackgroundWorker hoặc cấu trúc tương tự không? Chủ đề sinh sản liên quan đến rất nhiều chi phí, do đó, nó có ý nghĩa để tái sử dụng chúng bất cứ khi nào có thể. –