2012-05-28 40 views
7

Tôi hiện đang sử dụng System.Threading.Timer trên khoảng thời gian 10 giây. Tôi đã thêm một đoạn mã nhỏ để ghi vào một tệp mỗi khi bộ hẹn giờ kích hoạt, và trong khi hầu hết thời gian nó cháy vào thời gian, đôi khi (có lẽ khi phần còn lại của ứng dụng được mua), không thể kích hoạt được 30 hoặc 40 giây, và cháy liên tục và nhanh chóng.Hẹn giờ đáng tin cậy hơn System.Threading.Timer

Có bộ hẹn giờ đáng tin cậy hơn tôi có thể sử dụng trong .NET 3.5 không?

Các bộ đếm thời gian được thiết lập như sau

Timer someTimer = new Timer(new TimerCallback(SomeMethod), null, 0, 10000); 

... và gọi lại là:

private static void SomeMethod(object state) 

Tuy nhiên, rất khó để cung cấp mã nhiều hơn này, như Timer thường bắn một cách chính xác . Khi nó được nhúng vào trong một ứng dụng khổng lồ (~ 100.000 dòng hoặc hơn), với các chủ đề mulitple được bắn ra, trái, phải và trung tâm, bạn từ từ bắt đầu thấy bộ đếm thời gian bắn liên tục. Tôi đã nhìn thấy một số bài đăng gợi ý rằng ThreadPool có thể bị cạn kiệt, vì vậy tôi hiện đang tìm kiếm xem đây có phải là những gì tôi đang trải nghiệm hay không.

+5

Bạn có thể cung cấp một số mã mẫu thay vì * giả định * bộ hẹn giờ không đáng tin cậy không? Tôi có xu hướng tìm thấy đó là mã của riêng tôi, đó là vấn đề chứ không phải .NET Frameworks '. –

+0

Bộ hẹn giờ được thiết lập như sau: – JamesPD

+0

Sự kiện đói trong hồ bơi sẽ rất có thể xảy ra nếu quá trình xử lý đánh dấu mất quá 10 giây. Bạn sẽ từ từ nhận được một backlog của các mặt hàng. Các chiến thuật tiêu chuẩn là để ngăn chặn các bộ đếm thời gian vào mục để một sự kiện đánh dấu và bắt đầu lại một lần nữa ở cuối để không có "hẹn giờ bị rò rỉ" do thời gian xử lý lâu dài. –

Trả lời

3

Điều này nghe có vẻ giống như nạn đói trong hồ bơi. Hãy tìm các công việc chạy/chặn dài chạy trong nhóm luồng và viết lại bằng cách sử dụng async io, hoặc trong trường hợp các công việc chuyên sâu của CPU chạy dài, chỉ cần không chạy các công việc này trong nhóm luồng. Chạy chúng theo chủ đề của riêng họ hoặc sử dụng một nhân viên nền.

+0

Tôi đã hy vọng nó có thể chỉ là một vấn đề cụ thể cho System.Threading.Timer, và bằng cách chuyển sang Timer khác, tôi có thể giải quyết vấn đề. Sau khi gợi ý của bạn và với một số kiểm tra chặt chẽ hơn, nó thực sự trông giống như một vấn đề starvation ThreadPool. Cảm ơn tất cả sự giúp đỡ, mọi người. – JamesPD

8

Tham khảo các lớp học đếm thời gian khác nhau trong .net

Different Timer class in .net

Có ba lớp hẹn giờ gọi là 'hẹn giờ' trong .NET. Có vẻ như bạn đang sử dụng Windows Forms, nhưng thực sự bạn có thể thấy lớp System.Threading.Timer hữu ích hơn - nhưng hãy cẩn thận vì nó gọi lại trên một thread pool, vì vậy bạn không thể trực tiếp tương tác với biểu mẫu của bạn từ gọi lại.

Nhiều chính xác Timer - Theo MSDN

Windows Forms hẹn giờ thành phần là đơn luồng, và được giới hạn với độ chính xác 55 mili giây. Nếu bạn yêu cầu bộ đếm thời gian đa luồng với độ chính xác cao hơn, hãy sử dụng lớp Timer trong không gian tên System.Timers.

+0

Có vẻ như anh ấy đang sử dụng nó, nhưng anh ấy thực sự nói rằng anh ấy đang sử dụng 'System.Threading.Timer', theo chất lượng nhịp là một trong hai" đáng tin cậy "nhất để chọn. –

+0

Hi Romil, cảm ơn vì điều đó, như những người khác đã chỉ ra, nó có vẻ là một vấn đề starvation ThreadPool, nhưng cảm ơn cho bảng dù sao. Tôi chắc chắn nó sẽ có ích sớm hay muộn. – JamesPD

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