2016-01-14 38 views
0

我做了一個Windows服務,使用json字符串將性能數據發佈到mySQL數據庫。但是,此服務需要每分鐘發佈一次數據。我添加了一個計時器,但似乎並不是每分鐘都會將數據發送到數據庫。C#Windows服務與定時器不發送數據

我在我的項目中有2個類。 程序類啓動服務並運行性能代碼。

public static string ServiceName = "performanceService"; 
static void Main(string[] args) 
{ 
    if (!Environment.UserInteractive) 
    { 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
     { 
      new ServiceControl() 
     }; 
      ServiceBase.Run(ServicesToRun); 
     } 
     else 
     { 
      PerformanceCounter ramCount = new PerformanceCounter("Memory", "Available MBytes"); 
      PerformanceCounter cpuCount = new PerformanceCounter("Processor", "% Processor Time", "_Total"); 
     } 

剩餘代碼被省略。

然後我有一個ServiceControl類,它實際上是一個Windows服務。在這堂課中,我設定了我的計時器。

System.Timers.Timer timer = new System.Timers.Timer(); 
public ServiceControl() 
{ 
    ServiceName = Program.ServiceName; 
    InitializeComponent(); 
} 
public void timerElapsed(object sender, EventArgs e) 
    { 
     Console.WriteLine("Time Elapsed"); 
    } 

protected override void OnStart(string[] args) 
{ 
    base.OnStart(args); 
    timer.Elapsed += new ElapsedEventHandler(timerElapsed); 
    timer.Interval = 60000; 
    timer.Enabled = true; 
    timer.Start(); 

} 
protected override void OnStop() 
{ 
    base.OnStop(); 
    timer.Enabled = false; 
    timer.Stop(); 
} 
private void InitializeComponent() 
    { 
     // 
     // ServiceControl 
     // 
     this.ServiceName = "performanceService"; 

    } 

如果您還有其他代碼想要查看,請告訴我。 我的代碼中有什麼問題不允許服務以指定的時間間隔發佈數據? 謝謝。

+2

那麼會發生什麼?它從不發佈數據?它張貼一次?它隨機發布它?它......? – stuartd

+0

此外,這聽起來像使用帶有內置調度的Windows服務框架,如[Topshelf.Quartz](https://www.nuget.org/packages/Topshelf.Quartz/) – stuartd

+0

@stuartd它會更容易只在應用程序運行時發佈,而不是在服務運行時發佈。我希望該服務每分鐘發佈一次信息,而無需運行該應用程序。 – coderblogger

回答

0

我把我的計時器放在Main(string[] args)。這是我的回答:

static void Main(string[] args) 
{ 
    System.Timers.Timer timer = new System.Timers.Timer(); 
    timer.Interval = 300000; // 30 minutes 
    timer.Elapsed += new ElapsedEventHandler(serverCall); 
    timer.AutoReset = true; 
    timer.Start(); 
}