(Post 11/12/2007) Một luồng có thể bị tạm ngừng và tiếp tục một cách rõ ràng thông qua các phương thức Thread.Suspend và Thread.Resume. Cơ chế này hoàn toàn tách biệt với cơ chế chặn đã thảo luận trước đây. Cả hai hệ thống đều độc lập và hoạt động song song.

Tạm dừng và tiếp tục

Một chủ đề có thể tạm ngưng chính nó hoặc một chủ đề khác. Việc gọi Tạm ngưng kết quả là chuỗi đi vào trạng thái SuspendRequested nhanh chóng, sau đó khi đạt đến điểm an toàn để thu gom rác, nó sẽ chuyển sang trạng thái Suspended. Từ đó, nó chỉ có thể được tiếp tục thông qua một luồng khác gọi phương thức Tiếp tục của nó. Tiếp tục sẽ chỉ hoạt động trên một chuỗi bị treo, không phải một chuỗi bị chặn.

Từ .NET 2.0, Tạm ngưng và Tiếp tục đã không còn được dùng nữa, việc sử dụng chúng không được khuyến khích vì sự nguy hiểm vốn có khi tự ý tạm dừng một chuỗi khác. Nếu một chuỗi giữ khóa trên một tài nguyên quan trọng bị treo, toàn bộ ứng dụng (hoặc máy tính) có thể bị khóa. Điều này nguy hiểm hơn nhiều so với việc gọi Abort – điều này sẽ dẫn đến việc bất kỳ ổ khóa nào như vậy được phát hành – ít nhất là về mặt lý thuyết – nhờ mã trong các khối cuối cùng.

Tuy nhiên, sẽ an toàn khi gọi Tạm dừng trên luồng hiện tại – và khi làm như vậy, người ta có thể triển khai một cơ chế đồng bộ hóa đơn giản – với một luồng công nhân trong một vòng lặp – thực hiện một tác vụ, tự gọi Tạm ngưng, sau đó chờ được tiếp tục (“ thức dậy ”) bởi luồng chính khi một tác vụ khác đã sẵn sàng. Tuy nhiên, khó khăn là kiểm tra xem công nhân có bị đình chỉ hay không. Hãy xem xét đoạn mã sau:

worker.NextTask = “MowTheLawn”;
if ((worker.ThreadState & ThreadState.Suspended)> 0)
worker.Resume;
else
// Chúng ta không thể gọi Resume vì luồng đã chạy.
// Báo hiệu cho worker bằng cờ thay thế:
worker.A AnotherTaskAwaits = true;

Đây là luồng không an toàn khủng khiếp – mã có thể được sử dụng tại bất kỳ điểm nào trong năm dòng này – trong thời gian đó, nhân viên có thể tiến vào và thay đổi trạng thái của nó. Mặc dù có thể khắc phục được, nhưng giải pháp này phức tạp hơn giải pháp thay thế – sử dụng cấu trúc đồng bộ hóa như AutoResetEvent hoặc Monitor.Wait. Điều này làm cho việc Tạm dừng và Tiếp tục trở nên vô dụng trên tất cả các lần đếm.

Phương thức Tạm ngưng và Tiếp tục không dùng nữa có hai chế độ – nguy hiểm và vô dụng!

(Sưu tầm)

0981578920
icons8-exercise-96