2010-02-12 49 views
10

Tôi sử dụng mã sau trong trang web asp.net.Sử dụng System.Timers.Timer trong asp.net

Trên ứng dụng init tôi gọi InitializeTimer() một lần.

Mục tiêu của mã là chạy DoWork() một lần mỗi giờ (1 lần mỗi giờ).

Tôi cũng muốn mã thực thi trên mọi thời gian khác nhau mỗi vòng vì vậy tôi đã thêm phần ngẫu nhiên.

Kết quả tôi nhận được là không thành công, tôi không thể tìm thấy giải thích tại sao xảy ra.

Mã này thực hiện các chức năng sau 2 giờ, sau đó một lần nữa sau 2 giờ, sau đó sau khi 3hrs thì sau 2 giờ và 2 giờ một lần nữa. ****

Ai có thể giải thích lý do?

using System.Timers; 
.... 
private static random = new Random(); 
.... 
public static void InitializeTimer() 
{ 
    tTimer = new Timer(); 
    tTimer.AutoReset = true; 
    tTimer.Interval = TimeSpan.FromHours(1.0).TotalMilliseconds; 
    tTimer.Elapsed += new ElapsedEventHandler(ClassName1.tMailer_Elapsed); 
    tTimer.Start(); 
} 

private static void tTimer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    tTimer.Interval += random.Next(-5, 5); 

    DoWork(); 
} 

Cập nhật:

  1. Xin đừng gửi "sử dụng cửa sổ dịch vụ", hoặc "scheduled task". Câu hỏi của tôi là dành cho mã sau đây Tôi không tìm kiếm giải pháp thay thế tốt hơn. Ngoài ra, trong thời gian thử nghiệm này (10 giờ), trang web có lưu lượng truy cập cao, iis pool không khởi động lại!

  2. Dựa trên MSDN sau đây: (http://msdn.microsoft.com/en-us/library/system.timers.timer.interval.aspx)

Nếu khoảng thời gian được thiết lập sau khi Timer đã bắt đầu, đếm được đặt lại. Ví dụ: , nếu bạn đặt khoảng thời gian là 5 giây và sau đó đặt thuộc tính Đã bật thành true, số đếm bắt đầu tại thời gian Bật được đặt. Nếu bạn đặt lại khoảng thời gian 10 giây khi đếm là 3 giây, sự kiện đã qua là được tăng lên lần đầu tiên 13 giây sau khi Đã bật được đặt thành true.

Có thể thiết lập lại khoảng thời gian trong hàm đã trôi qua là nguyên nhân của sự cố không?

Có nghĩa là khi hàm tTimer_Elapsed được gọi là số đếm là 1 giờ (tối thiểu một phần nghìn giây) và mã của tôi "tTimer.Interval + = random.Next (-5, 5);" đang thêm một giờ nữa vào Khoảng thời gian?

+0

Nếu bạn lấy phần ngẫu nhiên, mã có hoạt động như mong đợi không? – mpeterson

+0

tôi không biết, mã đang chạy trên máy chủ sản xuất, tôi không thể thay đổi nó ngay bây giờ (một wont có thể cho một vài ngày), đó là lý do tại sao tôi hỏi câu hỏi để tìm một giải thích. – RuSh

+0

Vậy điều đó có nghĩa là nó hoạt động như mong đợi khi thử nghiệm cục bộ? – mpeterson

Trả lời

4

Kiểm tra this ra ngoài ... Jeff Atwood thực sự đã thảo luận điều tương tự. Tôi đoán nó đã làm việc, nhưng theo Jeff trang web outgrew phương pháp này để họ đã đi đến một nhiệm vụ chuyên dụng.

5

Ứng dụng ASP.NET sẽ bị tắt khi không sử dụng. Nếu ai đó truy cập trang web của bạn và sau đó không có thêm lần truy cập nào, nó có thể bị tắt. Bộ hẹn giờ của bạn sẽ không kích hoạt.

Đối với loại công việc bảo trì này, bạn muốn sử dụng tác vụ theo lịch cửa sổ hoặc dịch vụ cửa sổ.

+0

thx cho đầu vào. trang web hoặc iis pool KHÔNG được khởi động lại trong quá trình kiểm tra. tôi tin một cái gì đó là sai với mã của tôi. – RuSh

+0

@sharru IIS tái chế ứng dụng của bạn mà không cần sự can thiệp của người dùng. –

+1

tôi nhận thức được rằng, tôi đăng nhập những sự kiện, không khởi động lại xảy ra. – RuSh

1

Tôi đề nghị Sam thứ hai về việc sử dụng tác vụ theo lịch biểu của cửa sổ để truy cập trang mỗi giờ. Tôi đã cố gắng và cố gắng để tôi làm việc và nó hoạt động. Tôi đã đi đến một nhiệm vụ theo lịch trình và nó chưa bao giờ thất bại.

1

Từ .net 4.5.2, có một lớp được gọi là HostingEnvironment, nó có thể làm những gì bạn đang hỏi, ở đây là làm thế nào để sử dụng: https://blog.mariusschulz.com/2014/05/07/scheduling-background-jobs-from-an-asp-net-application-in-net-4-5-2

Phương pháp HostingEnvironment.QueueBackgroundWorkItem phép bạn lịch các mục công việc nền nhỏ. ASP.NET theo dõi các mục này và ngăn IIS đột ngột chấm dứt quy trình công nhân cho đến khi tất cả các mục công việc nền đã hoàn thành .

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