0

私は C# サービスを作成しています。その主な機能は、データベースから写真を取得し、1 日に 2 回ディレクトリに保存することです。通常、この操作には約 15 分かかります (写真がたくさんあります)。プログラムを実行するロジックを OnStart() に入れると、サービスを開始してから 1 分ほど後に、サービスが正常に開始されなかったことが報告されます。これは、OnStart() メソッド内にある時間が長すぎるためです。

約 1 分後に RunApp() メソッドを呼び出す OnStart() メソッドでタイマーを設定するにはどうすればよいですか?

編集:ここにいくつかのコードがあります。毎日実行するスケジューラーを設定した後、単純に実行したいです。タイマーを約 1 分間設定すると、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 サービスを開始する通常のプロセスは、スレッドを作成し、そのスレッドにサービス処理を実行させOnStartて、Windows をタイムリーに終了できるようにすることです。スレッドはまだバックグラウンド処理中です。例えば:

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 分ごとにログに記録します)。サービスと using ディレクティブに System.Threading を追加することを忘れないでください。

于 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 に答える