2012-11-29 36 views
6

Đây là một vấn đề khá đơn giản, nhưng mỗi khi tôi cố gắng tìm câu trả lời, nó vẫn hiển thị mọi thứ về Windows Scheduled Tasks, và đây không phải là điều này.Lập lịch chạy một phương thức tại một thời điểm nhất định.

Giả sử chương trình của tôi là về cơ bản này:

void StartDoingThings() 
{ 
    //At Specific System.DateTime 
    DoSomething() 

    //At another specific System.Datetime 
    DoSomethingElse() 
} 

nào để tôi đặt gì thay vì những ý kiến ​​để gây ra những phương pháp để chạy ở datetimes riêng biệt.

Tôi có thể sử dụng Thread.Sleep() hoặc thậm chí System.Threading.Timers và tính toán khoảng thời gian dựa trên (DateTimeOfEvent - DateTime.Now), nhưng chỉ đơn giản là có gì đó để nói (giả sử chương trình vẫn đang chạy): Tại 9:30:00 sáng ngày 30/11/2012, thực hiện phương pháp DoAnotherThing()?

+3

Có một khung công tác có tên là quartznet, hãy xem nó. http://quartznet.sourceforge.net/ –

+4

lý do bạn tiếp tục xem Tác vụ theo lịch là vì đó chính xác là những gì được thiết kế cho. để chạy các tác vụ theo lịch biểu. mỗi nhiệm vụ có thể là lịch trình hoạt động riêng của từng loại phù hợp và cho phép trình lập lịch quản lý khi thực thi. –

+0

Đó là sự hiểu biết của tôi (có thể không chính xác), các cửa sổ Task Scheduling là "Tại thời điểm X, chạy chương trình này" và sau đó có thể làm soemthing với chương trình đó. Tôi không chạy một chương trình khác, tôi chỉ muốn một cái gì đó bên trong chương trình hiện tại của tôi để chờ cho đến một thời điểm nhất định. Nếu tôi không chính xác, chắc chắn giúp tôi hiểu, nhưng với sự hiểu biết của tôi, Windows Task Scheduler sẽ không giúp tôi chạy một phần cụ thể của chương trình đã chạy của tôi tại một thời điểm nhất định. – Xantham

Trả lời

4

Nếu bạn muốn "lên lịch" một phương pháp để làm điều gì đó vào thời điểm định trước, có một số cách để thực hiện điều đó. Tôi sẽ không sử dụng Thread.Sleep() bởi vì điều đó sẽ buộc một sợi chỉ làm gì, đó là một sự lãng phí tài nguyên.

Thực tiễn phổ biến là sử dụng phương pháp bỏ phiếu theo dõi lịch biểu định kỳ thường xuyên (giả sử mỗi phút một lần) và xem lại danh sách tác vụ được chia sẻ để thực hiện. System.Timer có thể được sử dụng cho phương pháp bỏ phiếu:

aTimer = new System.Timers.Timer(10000); 
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 

Phương pháp OnTimedEvent có thể chứa mã mà duy trì một tập hợp các "nhiệm vụ" để thực hiện. Khi thời gian của nhiệm vụ xuất hiện, lần chạy tiếp theo của Bộ hẹn giờ sẽ làm cho nó hoạt động.

+0

Vì vậy, không có gì được xây dựng trong đó sẽ làm điều đó chỉ cần đưa ra một đối tượng dateTime? Nó có vẻ giống như một điều phổ biến như làm một cái gì đó tại một DateTime nhất định sẽ được xây dựng. Một số nhiệm vụ trong chương trình của tôi có thể có sự chậm trễ giữa chúng xuống một vài giây, và lên đến một vài giờ, và rõ ràng bảo nó kiểm tra mọi thứ hai sẽ tiêu thụ nhiều tài nguyên hơn là cần thiết. – Xantham

+0

Tôi cho rằng lý do nó không được tích hợp là thời gian hệ thống có thể bị thay đổi, dẫn đến sai sót (lịch biểu không bao giờ "tắt") –

+0

Điều đó có ý nghĩa, nhưng tôi đoán tôi sẽ giả định rằng đó là nguy cơ thay đổi thời gian hệ thống của bạn trong khi thực hiện tác vụ được hẹn giờ.Nếu nó chỉ là một sự thay đổi đồng bộ trong thời gian, sau đó tôi sẽ nghĩ rằng họ sẽ có một if (time> set_time) để chạy nó, thay vì chờ đợi thời gian chính xác (có thể bị bỏ qua trong thời gian đồng bộ). – Xantham

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