2012-11-30 32 views
5

Ví dụ: tôi muốn gọi hàm theo khoảng thời gian cụ thể (nhiệm vụ theo giờ hoặc hàng ngày).Nhiệm vụ lặp lại trong các khoảng thời gian cụ thể?

Tôi đã sử dụng Bộ hẹn giờ. Nhưng nó hoạt động miễn là máy chủ cục bộ của tôi đang hoạt động. Ví dụ:

public static void StartYahooWeatherManager() 
{ 
    Timer t = new Timer(1000 * 60 * 60 * 6 /* 6 hours */); 
    t.Elapsed += new ElapsedEventHandler(WriteYahoWeatherRssItemToDb); 
    t.Start(); 
} 

private static void WriteYahoWeatherRssItemToDb(object o, ElapsedEventArgs e) 
{ 
    YahooWeatherManager.InsertYahooWeatherRssItem(YahooWeatherManager.GetYahooWeatherRssItem()); 
} 

Tôi viết thông tin thời tiết cho db, trong khoảng thời gian 6 giờ. Dự án đã có trong Máy chủ. Sự kiện bộ hẹn giờ đang hoạt động miễn là máy chủ cục bộ của máy tính của tôi đang chạy.

Câu hỏi:

là gì sai về mã của tôi? (Hoặc sai hợp lý để sử dụng bộ đếm thời gian trong WebProject?) Tại sao bộ hẹn giờ chỉ hoạt động khi máy chủ cục bộ hoạt động?

Cách tốt nhất để quản lý các tác vụ khoảng thời gian là gì? (không cần asp.net)

Tôi hy vọng, tôi có thể giải thích vấn đề. Cảm ơn.

+0

Bạn có thực sự cần thực hiện điều đó trong một ứng dụng ASP.NET không? Bạn đã cân nhắc tạo một dịch vụ Windows chưa? –

+0

@RuiJarimba, Không cần, Tôi cũng hỏi điều đó. 'Cách tốt nhất để quản lý các nhiệm vụ khoảng thời gian là gì?'. Xin lỗi, tôi đã cập nhật câu hỏi. –

Trả lời

7

Lý do tại sao bộ đếm thời gian dừng là vì giờ này chạy trong ứng dụng ASP.NET của bạn mà tự nó được lưu trữ trên một máy chủ web. Khi máy chủ này dừng hoặc tái chế ứng dụng, AppDomain sẽ được gỡ xuống cùng với tất cả các chủ đề mà bạn có thể đã bắt đầu. Đó là lý do tại sao nó là một ý tưởng rất xấu để viết các tác vụ nền lặp lại trong một ứng dụng ASP.NET. Phil Haack blogged about the dangers.

Cách chính xác để thực hiện việc này là lưu trữ mã này trong một quy trình riêng biệt bên ngoài ứng dụng ASP.NET của bạn. Đây có thể là một dịch vụ cửa sổ hoặc một ứng dụng giao diện điều khiển được lập biểu để chạy trong các khoảng thời gian đều đặn bằng cách sử dụng ví dụ như trình lên lịch Windows. Bằng cách này, mã được đảm bảo luôn chạy.

2

Đề xuất của tôi là tạo một dịch vụ Windows sử dụng bộ hẹn giờ hoặc tạo một ứng dụng bình thường và tạo một tác vụ theo lịch để chạy nó trong khoảng thời gian bạn cần. bài StackOverflow Điều này có thể giúp bạn:

Windows service and timer

+0

+1. Cảm ơn rất nhiều... –

0

Bạn có thể vô hiệu hóa việc tái chế cho hồ bơi ứng dụng mà ứng dụng asp.net của bạn thuộc về. Rò rỉ bộ nhớ là rất hiếm đối với. Net, do đó bạn có thể dựa vào hầu hết thời gian của GC. Điều này cũng sẽ loại bỏ sự ấm lên sau khi tái chế và cải thiện trải nghiệm người dùng với hầu như không có nỗ lực nào.

Giải pháp tốt khác là tạo ứng dụng bảng điều khiển và lên lịch trong cửa sổ "Task Scheduler". Bạn sẽ có UI để quản lý thời gian và cách thức chạy. Việc duy trì các tác vụ đó dễ dàng hơn nhiều so với "Windows Service" và yêu cầu viết ít mã hơn.

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