2009-06-15 35 views
12

Tôi đang viết một dịch vụ cửa sổ cần ngủ trong thời gian dài (15 giờ là thời gian dài nhất sẽ ngủ, 30 phút là ngắn nhất). Tôi hiện đang sử dụng Thread.Sleep (calculateTime) để đặt mã của tôi vào chế độ ngủ. Thread.Sleep là lựa chọn tốt nhất hay tôi nên sử dụng một bộ đếm thời gian? Tôi đã googling này một lúc và không thể tìm thấy một câu trả lời ngắn gọn. Vì đây là một dịch vụ cửa sổ, tôi không phải lo lắng về việc khóa giao diện người dùng, vì vậy tôi không thể nghĩ ra lý do không sử dụng Thread.Sleep.Sử dụng Thread.Sleep() trong Dịch vụ Windows

Mọi thông tin chi tiết sẽ được đánh giá cao.

Trả lời

19

Tôi sẽ sử dụng bộ hẹn giờ, Thread.Sleep, có thể gây ra một phần chặn có thể ngăn dịch vụ ngừng hoạt động.

Nếu khoảng thời gian đó trải rộng và thường xuyên, bạn cũng có thể lên lịch cho nó. Nhưng nếu bạn đang nói về khoảng thời gian dài, không nhất quán, thì có một Timer sẽ tốt hơn.

7

Thường được coi là hành vi xấu để sử dụng Thread.Sleep() trong nhiều trường hợp.

Nếu bạn muốn dịch vụ chạy dưới nền, bạn nên sử dụng bộ hẹn giờ.

Nếu dịch vụ chỉ cần chạy trong khoảng thời gian định kỳ, tôi khuyên bạn nên xem xét sử dụng công cụ lập lịch tác vụ Windows để cho phép Windows chạy ứng dụng khi bạn cần.

5

Bạn không nên tính trước số lượng lớn thời gian và ngủ trong nhiều giờ. Ngủ trong một phút tốt nhất, sau đó thức dậy và tính toán lại thời gian, ngủ một lần nữa mà không thêm một phút nào. Tôi cho rằng tính toán rất rẻ hoặc có thể được thực hiện rất rẻ với bộ nhớ đệm. Vấn đề mà cố vấn của tôi đang cố gắng giảm thiểu là đồng hồ máy tính đáng ngạc nhiên 'nhảy', chủ yếu do thời gian trôi dạt được sửa bởi dịch vụ thời gian mạng, cũng vì tiết kiệm ánh sáng ban ngày và ít nhất là vì người dùng điều chỉnh đồng hồ. Vì vậy, tốt hơn là liên tục tính toán lại thời gian trong khoảng thời gian dài, ngay cả khi nó có nghĩa là thức dậy mỗi phút hoặc lâu hơn. Và đừng ngạc nhiên (ví dụ: không khẳng định) nếu bạn thức dậy trong 'quá khứ', đồng hồ có thể điều chỉnh ngược thời gian.

1

Một điều nữa cần xem xét là các luồng là tài nguyên hữu hạn và mỗi luồng tiêu thụ một phần bộ nhớ (1MB?) Cho ngăn xếp của nó. Họ cũng có thể tăng tải cho trình lên lịch.

Bây giờ, nếu dịch vụ của bạn không hoạt động nhiều thì không gian lãng phí là không đáng kể, nhưng bạn nên biết điều này trước khi bắt đầu phân bổ nhiều luồng. Sử dụng ThreadPool và/hoặc Timers hiệu quả hơn nhiều.

9

Vì dịch vụ có thể được yêu cầu dừng bất kỳ lúc nào bởi Trình quản lý kiểm soát dịch vụ, nên chuỗi của bạn luôn sẵn sàng trả lời các yêu cầu này, vì vậy bạn không nên sử dụng Thread.Sleep(). Thay vào đó, hãy tạo sự kiện đặt lại thủ công trong chuỗi chính và sử dụng phương thức WaitOne của nó với thời gian chờ trong chuỗi công việc của bạn. WaitOne sẽ trả về false khi hết thời gian.

Khi phương thức OnStop hoặc OnShutdown của lớp dịch vụ được gọi, hãy đặt sự kiện và điều đó sẽ khiến WaitOne trả về true và sau đó bạn có thể thoát chuỗi công việc của mình.

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