Как сделать, чтобы служба Windows завершила весь код, прежде чем повторять процесс - PullRequest
0 голосов
/ 04 ноября 2019

Итак, я создал сервис для запуска на сервере и просмотра различных общих папок и поместил их в таблицу базы данных для настраиваемого поиска, но он извлекает данные из местоположений поиска и перебирает их по одному, что прекрасно работаетс небольшими тестовыми папками. Теперь, когда я попытался использовать его по-настоящему, он не прошел через первый путь к папке, пока мой таймер не перезапустил его. Я мог бы сделать это дольше, но я в основном хочу, чтобы это работало постоянно и начиналось заново, как только закончится первый, или я не уверен, смогу ли я запустить все пути одновременно. Он работал каждые 30 минут, но определенно не достаточно долго.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Timers;


namespace MFTSearchService
{
    public partial class MFTSearchService : ServiceBase
    {
        Timer timer = new Timer(); // name space(using System.Timers;)
        public MFTSearchService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            WriteToFile("Service is started at " + DateTime.Now);
            timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
            timer.Interval = TimeSpan.FromMinutes(10).TotalMilliseconds; //number in milisecinds  
            timer.Enabled = true;
            //global::MFTSearchService.Search.SearchStart();


        }

        protected override void OnStop()
        {
            WriteToFile("Service is stopped at " + DateTime.Now);
        }

        private void OnElapsedTime(object source, ElapsedEventArgs e)
        {
            WriteToFile("Service is recall at " + DateTime.Now);
            timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
            timer.Interval = TimeSpan.FromMinutes(30).TotalMilliseconds; //number in milisecinds  
            timer.Enabled = true;
            global::MFTSearchService.Search.SearchStart();

        }
        public void WriteToFile(string Message)
        {
            string path = AppDomain.CurrentDomain.BaseDirectory + "\\Logs";
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
            string filepath = AppDomain.CurrentDomain.BaseDirectory + "\\Logs\\ServiceLog_" + DateTime.Now.Date.ToShortDateString().Replace('/', '_') + ".txt";
            if (!File.Exists(filepath))
            {
                // Create a file to write to.   
                using (StreamWriter sw = File.CreateText(filepath))
                {
                    sw.WriteLine(Message);
                }
            }
            else
            {
                using (StreamWriter sw = File.AppendText(filepath))
                {
                    sw.WriteLine(Message);
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 04 ноября 2019

Вместо вызова

global::MFTSearchService.Search.SearchStart();

в вашем таймере, вы можете добавить BackgroundWorker и запустить его в своем таймере. Для каждого тика на вашем таймере вы можете проверить, занят ли Backgroundworker или нет. BackgroundWorker не будет работать, пока не будет выполнено, если вы проверите его перед запуском.

private void OnElapsedTime(object source, ElapsedEventArgs e)
{
    WriteToFile("Service is recall at " + DateTime.Now);
    timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
    timer.Interval = TimeSpan.FromMinutes(30).TotalMilliseconds; //number in milisecinds  
    timer.Enabled = true;
    if (!backgroundWorker1.IsBusy())
    {
        backgroundWorker1.RunWorkerAsync();
    }
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    global::MFTSearchService.Search.SearchStart();
}

Фоновый рабочий не заблокирует ваш основной поток, поэтому ваш таймер продолжит цикл. Так что вы можете установить любой интервал.

...