2011-01-13 33 views
6

Tôi có hai lựa chọn sử dụng bộ đếm thời gian hoặc sử dụng giấc ngủ, tôi cần phải gọi một phương thức mỗi 3 giây sau khi phương pháp này kết thúc, tôi đã viết ví dụ cơ bản để chứng minh những gì tôi có nghĩa là:Những gì tôi nên sử dụng giấc ngủ hoặc hẹn giờ

public static void Main() 
{ 
    new Thread(new ThreadStart(fooUsingSleep)).Start(); 

    callToMethodAfterInterval(new Action<object, ElapsedEventArgs>(fooUsingTimer), 3000); 
} 

public static void fooUsingSleep() 
{ 
    Console.WriteLine("Doing some consuming time work using sleep"); 
    Thread.Sleep(3000); 
    fooUsingSleep(); 
} 

public static void fooUsingTimer(object dummy, ElapsedEventArgs dummyElapsed) 
{ 
    Console.WriteLine("Doing some consuming time work usning timer"); 
    callToMethodAfterInterval(new Action<object, ElapsedEventArgs>(fooUsingTimer), 3000); 
} 

public static void callToMethodAfterInterval(Action<object,ElapsedEventArgs> inMethod, int inInterval) 
{ 
    System.Timers.Timer myTimer = new System.Timers.Timer(); 
    myTimer.Elapsed += new ElapsedEventHandler(inMethod); 
    myTimer.Interval = inInterval; 
    myTimer.AutoReset = false; 
    myTimer.Start(); 
} 

Vì vậy, câu hỏi của tôi là

1) Tôi có thể viết mã bằng bộ hẹn giờ thanh lịch hơn không? Có nghĩa là loại bỏ các cuộc gọi đến phương thức callToMethodAfterInterval từ fooUsingTimer, làm cho bộ đếm thời gian một hoặc hai dòng, và loại bỏ các biến giả từ khai báo của fooUsingTimer?

2) Tôi hiểu rằng giấc ngủ không quá bận rộn chờ đợi (http://www.codeproject.com/KB/threads/ThreadingDotNet.aspx) Vì vậy, tôi không tìm thấy lý do để sử dụng tùy chọn hẹn giờ ở đây, vì giấc ngủ đơn giản hơn, cái gì là tốt hơn để sử dụng, phiên bản hẹn giờ hoặc ngủ?

3) Tôi biết rằng Timers.timer là luồng an toàn, nó có thể giúp tôi trong hành vi mà tôi muốn thực hiện không?

Cảm ơn.

Trả lời

2

Ngữ cảnh thực sự của chương trình cũng quan trọng.

Tùy chọn ngủ 'lãng phí' một Chủ đề, không phải là vấn đề trong một ứng dụng giao diện điều khiển nhỏ nhưng nói chung không phải là một ý tưởng hay.

Bạn không cần phải khởi động lại bộ đếm thời gian, sau đây sẽ tiếp tục tích tắc:

static void Main(string[] args) 
    { 
     var t = new System.Timers.Timer(1000); 
     t.Elapsed += (s, e) => CallMeBack(); 
     t.Start(); 

     Console.ReadLine(); 
    } 
+1

Tôi xin lưu ý rằng tôi không nghĩ rằng đây chính xác là những gì ban đầu có nghĩa là phải làm - nó đang thực hiện nhiệm vụ chạy dài và sau đó chạy lại 3 giây sau khi hoàn thành - máy của bạn sẽ chạy mỗi giây? – Paddy

+0

@Paddy, phải, tôi đã giả định một nhiệm vụ ngắn xoay. OP nên nói. –

+0

Tôi không muốn tùy chọn foo sẽ được gọi trước khi các cuộc gọi khác đến foo đã hoàn tất .. – Delashmate

0

Giấc ngủ sẽ thực hiện thủ thuật, Mặt khác, thiết bị đã được thiết kế cho mục đích chính xác đó, các quy ước tốt hơn và thường sẽ làm cho mã của bạn dễ hiểu hơn.

+0

Làm thế nào tôi có thể viết timer phần thanh lịch hơn? – Delashmate

3

Bạn có nhận ra rằng fooUsingSleep được tự xưng là lặp đi lặp? Nó cuối cùng sẽ tạo ra một tràn ngăn xếp.

Nếu bạn đang sử dụng bộ đếm thời gian, nó có thể đơn giản như thế này:

System.Windows.Forms.Timer t = new System.Windows.Forms.Timer(); 
    t.Interval = 3000; 
    t.Tick += new EventHandler((o,ea) => Console.WriteLine("foo")); 
+0

+1 cho giải pháp thanh lịch, làm thế nào nó sẽ gây ra tràn ngăn xếp? Tôi không thể nhìn thấy nó, trong giải pháp của bạn, phương pháp này có thể được gọi trước khi cái cuối cùng kết thúc và nó có thể dẫn đến những lỗi khó tìm, vì vậy lý do này tôi không đánh dấu là trả lời – Delashmate

+1

. đã hoàn thành vì chúng chạy trên cùng một chuỗi. Giải pháp của bạn (gọi fooUsingSleep() từ bên trong fooUsingSleep() cuối cùng sẽ tràn ngăn xếp vì mỗi phương thức gọi ngữ cảnh thực thi được đẩy lên một chồng, không phải là dung lượng không giới hạn) – Axarydax

+0

Ok, bây giờ tôi hiểu tràn ngăn xếp mà bạn đề cập:) – Delashmate

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