0

我正在编写一个 C# 服务,它的主要功能是从数据库中提取照片并每天两次将它们保存到一个目录中。此操作通常需要大约 15 分钟(有很多照片)。如果我将运行程序的逻辑放在 OnStart() 中,则在启动服务大约一分钟后报告它没有成功启动。这是因为它在 OnStart() 方法中的时间过长。

如何在 OnStart() 方法中设置一个计时器,大约一分钟后将调用我的 RunApp() 方法?

编辑:这是一些代码。在设置了让它每天运行的调度程序之后,我还想简单地运行它。我认为将计时器设置为大约一分钟会起作用,这样它就有时间退出 OnStart() 方法。然后,当计时器关闭时,应用程序将运行。

protected override void OnStart(string[] args)
{
    Scheduler sch = new Scheduler("Photo Sync");

    try
    {
      MailConfiguration mailConfig = new MailConfiguration(Properties.Settings.Default.EmailLogTo, Properties.Settings.Default.EmailLogFrom,
                                                           "Photo Sync Photo Service error", Properties.Settings.Default.SmtpServerIp, "Photo Sync");
      sch.MailComponent = mailConfig;
    }
    catch
    {

    }

    sch.SchedulerFired += new EventHandler(RunApp);

    try
    {
      sch.ScheduleDaily(Properties.Settings.Default.DailyScheduledTime);
    }

    RunApp();
}
4

3 回答 3

1

通常,启动 Windows 服务的正常过程是创建一个线程,并让该线程执行服务处理,以便OnStartWindows 及时退出。线程还在后台处理事情。例如:

protected CancellationTokenSource _tokenSource = null;

protected override void OnStart(string[] args)
{
    _tokenSource = new CancellationTokenSource();

    Task processingTask = new Task(() =>
       {
           while(!_tokenSource.IsCancellationRequested)
           {
               // Do your processing
           }
       });

    processingTask.Start();
}

protected override void OnStop()
{
    _tokenSource.Cancel();
}

如果您的服务不需要无限期地运行,那么您可能需要考虑计划任务。

于 2013-03-27T16:10:03.563 回答
1

在服务的 OnStart 方法中启动的单独线程中运行保存功能。像这样的东西:

protected override void OnStart(string args[])
{

    // your other initialization code goes here

    // savePhotos is of type System.Threading.Thread
    savePhotosThread = new Thread(new ThreadStart(SavePhotos));
    savePhotosThread.IsBackground = true;
    savePhotosThread.Name = "Save Photos Thread";
    savePhotosThread.Start();

}

You'll place the functionality for saving the files in the `SavePhotos` method, maybe something like this:

private void SavePhotos()
{

    // logic to save photos
}

我已经使用与上面类似的代码来进行日志记录(我每 5 分钟左右记录一次服务的统计信息),以实现我几年前编写的始终在线服务。不要忘记将 System.Threading 添加到您的服务和 using 指令中。

于 2013-03-27T16:10:29.487 回答
0
    System.Threading.Timer Timer1 = new System.Threading.Timer(RunApp, null, 1000, System.Threading.Timeout.Infinite);

void RunApp(object State)
{
}
于 2013-03-27T16:12:03.100 回答