2010-04-07 34 views
5

Câu hỏi của tôi là đây là phương pháp hay nhất để thực hiện việc này. Không thể tìm thấy bất kỳ ví dụ hay nào. Tôi đã sau mã trong tập tin được tạo ra bởi VS2005:cách triển khai vòng lặp dịch vụ cửa sổ chờ đợi một khoảng thời gian trong C#/.NET2.0

public partial class ObjectFolder : ServiceBase 
{ 
    protected override void OnStart(string[] args) 
    { 
     ObjectFolderApp.Initialize(); 

     ObjectFolderApp.StartMonitorAndWork(); 
    } 

    protected override void OnStop() 
    { 
     // TODO: Add code here to perform any tear-down necessary to stop yourservice. 
    } 
} 

thì:

class ObjectFolderApp 
{ 
    public static bool Initialize() 
    { 
     //all init stuff 
     return true; 
    } 


    public static void StartMonitorAndWork() 
    { 
     Thread worker = new Thread(MonitorAndWork); 
     worker.Start(); 
    } 


    private static void MonitorAndWork() 
    { 
     int loopTime = 60000; 
     if (int.TryParse(_cfgValues.GetConfigValue("OfWaitLoop"), out loopTime)) 
      loopTime = 1000 * loopTime; 

     while (true) 
     { 
      /* create+open connection and fill DataSet */ 
      DataSet ofDataSet = new DataSet("ObjectFolderSet"); 
      using (_cnctn = _dbFactory.CreateConnection()) 
      { 
       _cnctn.Open(); 

       //do all kinds of database stuff 
      } 
      Thread.Sleep(loopTime); 
     } 
    } 
} 

Trả lời

14

Re-băm câu trả lời của tôi từ this question, cách khuyến cáo là sử dụng một bộ đếm thời gian và đoạn mã sau:

public class MyService : ServiceBase 
{ 
    private Timer workTimer; // System.Threading.Timer 

    protected override void OnStart(string[] args) 
    { 
     workTimer = new Timer(new TimerCallback(DoWork), null, 5000, 5000); 
     base.OnStart(args); 
    } 

    protected override void OnStop() 
    { 
     workTimer.Dispose(); 
     base.OnStop(); 
    } 

    private void DoWork(object state) 
    { 
     RunScheduledTasks(); // Do some work 
    } 
} 

đơn giản!

Lưu ý rằng loại Timer đang được sử dụng là System.Threading.Timer, giống như Justin chỉ định.

+1

Đoạn mã trên hoạt động như một nét duyên dáng. Tôi đang sử dụng dịch vụ windows để kiểm tra hàng đợi. –

+0

cảm ơn! ... hmmm ... vì vậy bạn đề nghị tôi thậm chí không gọi ObjectFolderApp.Initialize(); trong OnStart ?? Nó phải được khởi tạo chỉ một lần. Một câu hỏi khác là gọi các phương thức cơ sở bị ghi đè. Tại sao vậy? –

+0

@matti: Tôi không biết những gì bạn đang làm trong 'Initialize', vì vậy thật khó để nói. Bạn vẫn có thể cần nó. Để gọi các phương thức cơ bản, bạn không nhất thiết phải, nhưng như một quy tắc chung, đó là một ý tưởng tốt nếu những gì bạn đang cố gắng làm là * mở rộng * logic lớp cơ sở như trái ngược với * thay thế * nó (đó là ngữ nghĩa mong muốn ở đây). – Aaronaught

3

Sử dụng một System.Threading.Timer bắn quá trình tắt ở khoảng thời gian dự kiến.

+0

Đồng ý. 'Thread.Sleep()' là một dấu hiệu của một thiết kế xấu. – Kimi

+0

@al: tại sao Thread.Sleep là xấu? –

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