2010-08-13 42 views
7

Tôi có Dịch vụ truy cập cơ sở dữ liệu sau mỗi 10 giây và nhận dữ liệu nếu có. Vấn đề là xử lý dữ liệu này có thể mất đến 30 giây. Nếu tôi sử dụng Bộ hẹn giờ với khoảng thời gian 10 giây, dịch vụ sẽ nhận được cùng một dữ liệu hai lần.C# Bộ đếm thời gian so với chủ đề trong dịch vụ

Hiệu quả Tôi đang cố gắng để đạt được (Chỉ cần cho visualization):

while(true) 
{ 
    if(Getnrofrows() > 0) 
     do stuff 
    else 
     sleep for 10 sec 
} 

PPL nói Thread.Sleep là một ý tưởng tồi trong dịch vụ sản xuất, làm thế nào để làm điều này với giờ?

/mike

+4

Họ cũng nói * tại sao * Thread.Sleep là một ý tưởng tồi? – Heinzi

Trả lời

10

Bạn có cố gắng thiết lập hẹn giờ sở hữu auto reset false, và cho phép hẹn giờ một lần nữa khi quá trình dữ liệu làm mới kết thúc

using System; 

public class PortChat 
{ 
    public static System.Timers.Timer _timer; 
    public static void Main() 
    { 

     _timer = new System.Timers.Timer(); 
     _timer.AutoReset = false; 
     _timer.Interval = 100; 
     _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed); 
     _timer.Enabled = true; 
     Console.ReadKey(); 
    } 

    static void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     //Do database refresh 
     _timer.Enabled = true; 
    } 
} 
+0

Chính xác những gì tôi đang tìm kiếm. Cám ơn! –

+0

Xin lỗi nhưng không nên là _timer.Enabled = false trong sự kiện đã trôi qua? Tại sao nó được đặt thành true một lần nữa nếu nó được thực hiện trong chính? – Neale

+0

@Neale, Câu hỏi ban đầu là về tạm dừng vòng lặp cho đến khi một cái gì đó không được hoàn thành. Khi chúng ta đặt _timer.Autoreset = false thì vòng lặp sẽ chỉ xuất hiện một lần sau khi bật hẹn giờ. Vì vậy, khi vòng lặp của chúng tôi kết thúc bằng việc đọc, chúng tôi sẽ kích hoạt lại hẹn giờ bằng cách bật nó – adopilot

0

Không có gì sai với phương pháp này là. Một chủ đề ngủ không tiêu thụ bất kỳ chu kỳ CPU nào.

Nếu bạn cần thực hiện điều gì đó chính xác sau mỗi giây X, bộ hẹn giờ là cách để thực hiện. Nếu, mặt khác, bạn muốn tạm dừng trong X giây, sau đó Thread.Sleep là thích hợp.

+0

Một luồng ngủ không thể tiêu thụ bất kỳ chu kỳ CPU nào nhưng nó sẽ tiêu tốn nhiều tài nguyên hạt nhân so với đối tượng Timer – Zuuum

1

Tôi không thấy bất kỳ sự cố nào khi sử dụng chế độ Ngủ ở tất cả các mục đích khác ngoài việc bạn có thể kết thúc bằng mã xấu.

Để trả lời câu hỏi của bạn:

public class MyTest 
{ 
    System.Threading.Timer _timer; 


    public MyTest() 
    { 
     _timer = new Timer(WorkMethod, 15000, 15000); 
    } 


    public void WorkMethod() 
    { 
     _timer.Change(Timeout.Infinite, Timeout.Infinite); // suspend timer 

     // do work 

     _timer.Change(15000, 15000); //resume 

    } 
} 
0

Thread.Sleep không phải là xấu trong chính nó trong một dịch vụ, chỉ rằng bạn cần phải đáp ứng các lệnh dịch vụ, vì vậy sợi nhân viên của bạn không nên đi ngủ cho một giờ, nhưng thay vào đó cần ngủ trong một thời gian ngắn và sau đó thức dậy và lắng nghe nếu phần điều khiển dịch vụ của dịch vụ bảo nó dừng lại vì một lý do nào đó.

Bạn muốn làm như vậy nếu quản trị viên yêu cầu dịch vụ của bạn dừng lại, nó sẽ dừng đủ nhanh để nó không nhận được bất kỳ thông báo hết thời gian nào mà quản trị viên không thể chắc chắn rằng dịch vụ của bạn bị dừng và an toàn để khởi động lại máy hoặc tương tự.

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