Чтение файла с помощью службы Win

90
30 декабря 2020, 07:30

Всем привет.

Создал службу, на C# (я не спец...), которая по ходу должна читать *.xml и выполнять задания.

Появилась проблема при запуске служба вылетает - полагаю это связано с чтением xml. тк без нее служба запускается и работает нормально. вот пример кода:

    namespace Backup1cSrvInstaller
    {
        public class WinServiceInstaller2 : ServiceBase
        {
            private static Logger logger = LogManager.GetCurrentClassLogger();
            const string MyServiceName = "Backup1C";
            public WinServiceInstaller2()
            {               
                InitializeComponent();
            }

            private void InitializeComponent()
            {
                this.ServiceName = MyServiceName;
            }
            protected override void Dispose(bool disposing)
            {
                base.Dispose(disposing);
            }
            protected override void OnStart(string[] args)
            {
                logger.Trace("[WinService] -> service onSTART");
                Task.Run(() => Foo(10));
            }
            protected override void OnStop()
            {
                logger.Trace("[WinService] -> service onSTOP");
            }
            async void Foo(int taskCount) {
                int delay = 10000;
                //AppService appSrv = new AppService();
                DataService dataSrv = new DataService();
                while (true) {
                    logger.Info("[WinServiceInstaller] -> TASK START [***** Starting new block *****]");
                    List<Data> datas = dataSrv.readXml();
                    /*
                    DateTime dt = new DateTime();
                    foreach(Data data in datas){
                        logger.Info("[WinServiceInstaller] -> For-1");
                        Schedule sc = data.ScheduleObj;
                        for(int i=0; i<sc.Days.Count; i++){
                            logger.Info("[WinServiceInstaller] -> For-2");
                            if(dt.DayOfWeek.Equals(sc.Days[i])){
                                logger.Info("[WinServiceInstaller] -> IF-1");
                                for(int j=0; j<sc.Times.Count; j++){
                                    logger.Info("[WinServiceInstaller] -> For-3");
                                    //DateTime dt2 = DateTime.Parse(sc.Times[j].);
                                    if(dt < sc.Times[j]){
                                        logger.Info("[WinServiceInstaller] -> IF-2");
                                        logger.Info("[TASK] -> TASK START -> ID: " + data.Id + ", Name: " + data.ShortName);
                                    }
                                }
                            }
                        }
                    }
                    */
                    /*
                    for (int i = 0; i < taskCount; i++) {
                        int index = i;
                        await Run(delay, index);
                    }
                   */  
                }
            }
            async Task Run(int delay, int taskIndex) {
                //Console.WriteLine("Do some operation, index is: {0}", taskIndex);
                logger.Info("Do some operation, index is: " + taskIndex);
                await Task.Delay(delay);
            }


        }

В общем вот такая вот проблема. а вообще xml читаема, тк. ее читает основной интерфейс другая прога. а это хотел запилить службу с заданиями ...

Но я уверен что то именно с методом чтения xml...

читаю вот так (и вероятно в это и заключается проблема)

        ...
        XmlDocument xDoc = new XmlDocument();
        xDoc.Load(fileName);
        XmlElement xRoot = xDoc.DocumentElement;
        foreach (XmlElement xnode in xRoot) {
         ...

Так а как тогда его читать ???

Answer 1

нашел проблему, и она как всегда банальная проблема с путем к файлу xml, когда заменил путь на xDoc.Load("C:/list.xml") - начало работать ... почему так? да потому что у сервиса WorkDir = C:/Windows/System32/ и соответственно оно и файлик ищет там же...

Но на этом все не закончилось!!!

Что бы динамически подтягивать файл xml, я начал запускать сервис с параметрами, в качестве параметра начал кормить путь к этому xml.В итоге получилось вот так. запуск сервиса со стороны внешнего (основного) интерфейса (тк у меня есть прога в которой просто кнопки и набор статического ф-ла, а сервис мне нужен для автоматизации этого ф-ла, и соответственно сервис запускается через этот интерфейс), в общем кусочек кода - вот:

        public static void StartService(string serviceName, int timeoutMilliseconds)
    {
        ServiceController service = new ServiceController(serviceName);
        try {
            TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
            service.Start({Path.GetFullPath("list.xml")});
            service.WaitForStatus(ServiceControllerStatus.Running, timeout);
        } catch {
            // ...
            logger.Error("[WinService] -> TASK START");
        }
    }

а в самом сервисе метод onStart() принимет переменное число параметров т.о. получилось вот так:

        protected override void OnStart(string[] args)
    {
        logger.Trace("[WinService] -> service onSTART");
        AddLog("start");
        Task.Run(() => Foo(args[0]));
    }

Остальной код приведен выше в определении проблемы

READ ALSO
Unity сцена внутри картинки

Unity сцена внутри картинки

У меня есть картинка для экрана игры, но она с полями (счет, уровень и тп)

108
XML файл при чтении выдаёт ошибку

XML файл при чтении выдаёт ошибку

Пытаюсь прочитать XML файл

133
Как удалить привязки DataGridViewComboBoxCell из dataGridView?

Как удалить привязки DataGridViewComboBoxCell из dataGridView?

Нужно сделать сброс dataGridView1 в начальное состояние, те удалить все строки и вставить новые изначальные

125
Принципы ООП в С# [закрыт]

Принципы ООП в С# [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах

119