2015-01-07 17 views
5

Tôi đang viết chương trình sẽ thực hiện thao tác sau mỗi 10 hoặc 15 phút. Tôi muốn nó được chạy tất cả các thời gian, vì vậy tôi cần một cái gì đó có giá rẻ về sức mạnh xử lý. Những gì tôi đã đọc cho đến nay dường như gợi ý rằng tôi muốn sử dụng một Timer. Đây là một đoạn mã tôi có cho đến nay.C# Tạm dừng thực hiện chương trình

class Program { 
    private static Timer timer = new Timer(); 

    static void Main(string[] args) { 
     timer.Elapsed += new ElapsedEventHandler(DoSomething); 
     while(true) { 
      timer.Interval = TimerMilliseconds(); // The duration of the wait will differ each time 
      timer.Enabled=true; 
     } 
    } 
} 

Vấn đề ở đây là vòng lặp while chỉ tiếp tục thực hiện nhanh chóng. Làm cách nào để tạm dừng thực hiện cho đến khi hết giờ. Chương trình của tôi thực sự không cần phải đa luồng. Bộ hẹn giờ có phải là công cụ thích hợp cho công việc này không?

Cảm ơn bạn trước vì đã trợ giúp!

CẬP NHẬT: Xin lỗi vì sự nhầm lẫn. Tôi đã triển khai phương thức DoSomething. Tôi chỉ không bao gồm nó vì tôi không tin rằng đó là một phần của vấn đề của tôi.

+3

Gợi ý: Xóa vòng lặp while và thực hiện 'DoSomething'. – Vlad

+4

Ngoài ra, bạn cũng có thể cân nhắc đưa ứng dụng của mình thành [Dịch vụ Windows] (http://msdn.microsoft.com/en-us/library/y817hyb6%28v=vs.110%29.aspx) –

Trả lời

4

Timer sẽ kích hoạt sự kiện Elapsed sau khi khoảng thời gian được chỉ định đã trôi qua.

tôi sẽ làm một cái gì đó như thế này:

private static Timer timer = new Timer(); 

static void Main(string[] args) 
{ 
    timer.Elapsed += new ElapsedEventHandler(DoSomething); 
    timer.Interval = TimerMilliseconds(); // The duration of the wait will differ each time 
    timer.Enabled=true; 

    Console.ReadKey(); //Wait for keypress to terminate 
} 

Bạn cũng có thể thực hiện điều này như một dịch vụ, do đó bạn không cần phải có một cuộc gọi chặn như Console.ReadKey để giữ cho chương trình từ chấm dứt.

Cuối cùng, bạn chỉ có thể thay đổi khoảng thời gian trong xử lý sự kiện:

static void DoSomething(...) 
{ 
    timer.Stop(); 
    timer.Interval = TimerMilliseconds(); 

    ... 
    timer.Start(); 
} 
+0

Điều này trông giống như những gì tôi muốn. Tôi đang sử dụng System.Timers.Timer. Tôi có cần dừng hẹn giờ theo cách thủ công không? Tôi tin rằng nó tự động dừng nếu tham số AutoReset không được thiết lập? – Joe

+1

@ Joe Bạn không * có * để dừng nó, nhưng nếu quá trình chạy dài, và khoảng thời gian hẹn giờ ngắn, bạn có thể có hai thực thi cùng một lúc. Điều đó tùy thuộc vào bạn, và bạn có thể thoát ra mà không có nó. – BradleyDotNET

2

Vấn đề với mã này là bạn đang sử dụng một vòng lặp để thiết lập IntervalEnabled thuộc tính của Timer, mà sẽ thực hiện cho biết tập hơn và hơn - nó không phải chờ đợi cho bộ đếm thời gian để thực hiện một cách nào đó .

Nếu ứng dụng của bạn không cần phải bị tắt tiếng, thì bạn có thể tốt hơn chỉ cần gọi Thread.Sleep giữa các lần thực hiện.

class Program {  
    static void Main(string[] args) { 
     while(true) { 
      Thread.sleep(TimerMilliseconds()); // The duration of the wait will differ each time 
      DoSomething(); 
     } 
    } 
} 
+0

Đây là những gì tôi muốn, nhưng tôi sử dụng Thread.sleep là một không-không. – Joe

+1

Thread.Sleep here is * có lẽ * ok, nhưng Timer vẫn tốt hơn – BradleyDotNET

1

xóa hoàn toàn vòng lặp while.

bên trong hàm DoSomething() (khi đã triển khai), hãy dừng bộ hẹn giờ lúc bắt đầu và khi kết thúc đặt lại khoảng thời gian trước khi khởi động lại bộ hẹn giờ.

0

Tôi đoán các ý kiến ​​và answrs đã cung cấp các gợi ý mà bạn cần, nhưng MSDN docs for Timer thực sự cung cấp một ví dụ tốt đẹp. Theo tôi, phương pháp Timer là một chút gọn gàng hơn, nó dễ dàng hơn để đọc các ý định của bạn và tóm tắt các chi tiết về cách gọi mã được lên lịch của bạn.

1

lấy hẹn giờ và vòng lặp từ logic của bạn. Chỉ cần sử dụng Windows Scheduler để thực hiện chương trình của bạn sau 15 phút. Hoặc bạn có thể sử dụng dịch vụ windows. Vui lòng đọc Best Timer for using in a Windows service

0

Đây là một cách tiếp cận khác sử dụng ManualResetEvent và WaitOne(). Điều này sẽ cho phép bạn ngăn chặn các chủ đề chính mà không đáng lo ngại về nó bị giết một cách vô tình bởi một phím bấm không đúng. Bạn cũng có thể Đặt() MRE khi các điều kiện nhất định được đáp ứng để cho phép ứng dụng thoát ra một cách duyên dáng:

class Program 
{ 

    private static Timer timer; 
    private static ManualResetEvent mre = new ManualResetEvent(false); 

    static void Main(string[] args) 
    { 
     timer = new Timer(TimerCallback, null, 0, (int)TimeSpan.FromMinutes(15).TotalMilliseconds); 
     mre.WaitOne(); 
    } 

    private static void TimerCallback(object state) 
    { 
     // ... do something in here ... 
     Console.WriteLine("Something done at " + DateTime.Now.ToString()); 
    } 

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