Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
xam max
3 / 3 / 2
Регистрация: 27.09.2009
Сообщений: 200
1

Найти косяки в службе

28.08.2013, 13:19. Просмотров 449. Ответов 5
Метки нет (Все метки)

Написал свою первую службу. По задумке она через определенное время очищает некоторые папки. Интервал очистки и папки считываются из файла. Вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.IO;
using System.Threading;
 
namespace TempCleaner
{
    public partial class Service1 : ServiceBase
    {
        private System.Timers.Timer Timer;
        private StreamWriter FileLog;
        private StreamReader FileOptions;
        private string PathLog;
        private string PathOptions;
        private int interval;
        List<string> DirectoryForClean;
        Thread BeginSettings;
 
        public Service1()
        {
            InitializeComponent();
        }
 
        protected override void OnStart(string[] args)
        {
            BeginSettings = new Thread(StartService);
            BeginSettings.IsBackground = true;
            BeginSettings.Start();
        }
 
        protected void StartService()
        {
            PathLog = "C:\\TempCleanerLog.txt";
            PathOptions = "C:\\TempCleanerOptions.opt";
            DirectoryForClean = new List<string>();
            FileLog = new StreamWriter(PathLog);
            FileLog.WriteLine("Запуск службы" + DateTime.Now.ToString("dd:mm:yy hh:mm:ss"));
            FileLog.Flush();
            FileLog.Close();
            FileOptions = new StreamReader(PathOptions);
            Int32.TryParse(FileOptions.ReadLine(),out interval);
            FileOptions.Close();
            Timer = new System.Timers.Timer(interval);
            Timer.AutoReset = true;
            Timer.Enabled = true;
            Timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer_elapsed);
            Timer.Start();
        }
 
        protected override void OnStop()
        {
            FileLog = new StreamWriter(PathLog);
            FileLog.WriteLine("Остановка службы" + DateTime.Now.ToString("dd:mm:yy hh:mm:ss"));
            FileLog.Flush();
            FileLog.Close();
            FileOptions.Close();
            Timer.Stop();
        }
 
        protected void Timer_elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            FileLog = new StreamWriter(PathLog);
            FileOptions = new StreamReader(PathOptions);
            FileOptions.ReadLine();
            while (FileOptions.EndOfStream != true)
                DirectoryForClean.Add(FileOptions.ReadLine());
            for (int i = 0; i < DirectoryForClean.Count; ++i)
                try
                {
                    Directory.Delete(DirectoryForClean[i]);
                    Directory.CreateDirectory(DirectoryForClean[i]);
                    FileLog.WriteLine("Очистка папки " + DirectoryForClean[i]);
                    FileLog.Flush();
                }
                catch (Exception except)
                {
                    FileLog.WriteLine(except.Message);
                    FileLog.Flush();
                }
            DirectoryForClean.Clear();
            FileOptions.Close();
            FileLog.Close();
        }
    }
}
Скажите какие косяки я допустил при написании, чем это грозит и что здесь желательно исправить. И еще вопрос, нужно ли переопределять метод OnShutdown ? или onStop автоматически запускается при завершении системы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2013, 13:19
Ответы с готовыми решениями:

Вызов функции в службе
Необходимо написать службу которая будет отслеживать подключение USB устройств....

Использование таймера в службе
Здравствуйте. есть решение с двумя проектами: служба windows и библиотека...

GetForegroundWindow() не работает в службе
Здравствуйте. Пишу сервис и возникла проблема с методом GetForegroundWindow()....

Получение информации о службе
Как средствами c# узнать тип запуска службы (автоматически или вручную) и...

Воспроизведение звука в службе Windows
Здравствуйте, передо мной стоит задача воспроизведения звуковой сигнализации...

5
Psilon
Master of Orion
Эксперт .NET
6009 / 4859 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
28.08.2013, 14:17 2
Косяк №1: как вы собираетесь это тестировать? То есть попробуйте написать тесты так, чтобы не пришлось методы делать public. Тогда поймете в чем косяк.
№2: нигде нету using'ов: если где-то какая-то ошибка IO выскочит - сразу же начнется утечка.

Дальше не смотрел.
1
xam max
3 / 3 / 2
Регистрация: 27.09.2009
Сообщений: 200
28.08.2013, 15:41  [ТС] 3
А как вообще тестировать службы? Просто обычно я всегда смотрел на breakpoint.
0
Psilon
Master of Orion
Эксперт .NET
6009 / 4859 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
28.08.2013, 16:48 4
xam max, зайдите в солюшн, в "Обозревателе решений" нажмите на солюшн правой клавишей и жмете "добавить проект". Там выбираете в категории тест "проект модульных тестов". Ну и пишете там все что надо. К примеру, тестируем функцию Add:
C#
1
2
3
4
5
6
7
    public static class MyClass
    {
        public static int Add(int x, int y)
        {
            return x + y;
        }
    }
для этого пишем тестовый класс MyClassTests
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using ConsoleApplication128;
using Microsoft.VisualStudio.TestTools.UnitTesting;
 
namespace MyClassTests
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            int x = 10;
            int y = 20;
            int result = MyClass.Add(x, y);
            Assert.AreEqual(result, 30);
        }
    }
}
ну а после этого прогоняем тест и все в порядке должно быть
2
xam max
3 / 3 / 2
Регистрация: 27.09.2009
Сообщений: 200
29.08.2013, 18:03  [ТС] 5
Хорошо вот что получилось :
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.IO;
using System.Threading;
 
namespace TempCleaner
{
    public partial class Service1 : ServiceBase
    {
        private System.Timers.Timer Timer;
        private StreamWriter FileLog;
        private StreamReader FileOptions;
        private string PathLog;
        private string PathOptions;
        private int interval;
        List<string> DirectoryForClean;
        Thread BeginSettings;
 
        public Service1()
        {
            InitializeComponent();
        }
 
        public override void OnStart(string[] args)
        {
            BeginSettings = new Thread(StartService);
            BeginSettings.IsBackground = true;
            BeginSettings.Start();
        }
 
        public void StartService()
        {
            PathLog = "C:\\TempCleanerLog.txt";
            PathOptions = "C:\\TempCleanerOptions.opt";
            DirectoryForClean = new List<string>();
            using (FileLog = new StreamWriter(PathLog))
            {
                FileLog.WriteLine("Запуск службы" + DateTime.Now.ToString("dd:mm:yy hh:mm:ss"));
                FileLog.Flush();
                FileLog.Close();
            }
            using (FileOptions = new StreamReader(PathOptions))
            {
                Int32.TryParse(FileOptions.ReadLine(), out interval);
                FileOptions.Close();
            }
            Timer = new System.Timers.Timer(interval);
            Timer.AutoReset = true;
            Timer.Enabled = true;
            Timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer_elapsed);
            Timer.Start();
        }
 
        public override void OnStop()
        {
            using (FileLog = new StreamWriter(PathLog))
            {
                FileLog.WriteLine("Остановка службы" + DateTime.Now.ToString("dd:mm:yy hh:mm:ss"));
                FileLog.Flush();
                FileLog.Close();
            }
            Timer.Stop();
        }
 
        public void Timer_elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            
            using(FileOptions = new StreamReader(PathOptions))
            {
                FileOptions.ReadLine();
                while (FileOptions.EndOfStream != true)
                    DirectoryForClean.Add(FileOptions.ReadLine());
            }
            using (FileLog = new StreamWriter(PathLog))
            {
                for (int i = 0; i < DirectoryForClean.Count; ++i)
                    try
                    {
                        Directory.Delete(DirectoryForClean[i]);
                        Directory.CreateDirectory(DirectoryForClean[i]);
                        FileLog.WriteLine("Очистка папки " + DirectoryForClean[i]);
                        FileLog.Flush();
                    }
                    catch (Exception except)
                    {
                        FileLog.WriteLine(except.Message);
                        FileLog.Flush();
                    }
                DirectoryForClean.Clear();
                FileOptions.Close();
                FileLog.Close();
            }
        }
    }
}
Но вот что непонятно:нужно ли переопределять метод OnShutdown ? или onStop автоматически запускается при завершении системы?
0
Psilon
Master of Orion
Эксперт .NET
6009 / 4859 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
29.08.2013, 18:14 6
xam max, видите, что случилось? Вы вынуждены были сделать методы public, хотя они все должны быть protected Следоательно, ошибка в дизайне

по правде говоря я знаю, что это за ошибка, у меня она же была, и именно таким способом я её увидел и исправил. Кстати подробнее можете почитать тут:

Процесс создания теста дает всестороннюю оценку разрабатываемому модулю. Подготовка к использованию чересчур громоздка? Возможно, у нас слишком много вспомогательных классов (или они нарушают Закон Деметры) и можно попытаться скрыть их за дополнительной абстракцией. Получается многовато сценариев использования или фикстур? Вероятно, тестируемый код имеет слишком много обязанностей. Трудно изолировать тестируемое поведение или непонятно, как его проверить? Наверное, у нас неправильное API или сама абстракция, и ее надо выделить как-то иначе. С TDD эти проблемы становятся очевидными мгновенно. Их решение требует навыков проектирования, таких же, каких требуют другие методики разработки. Но создание теста в самом начале дает отличную возможность отреагировать на ошибки и проверить проект модуля до его реализации. Самое дешевое время для исправления кода – до его написания.
http://habrahabr.ru/post/191010/
0
29.08.2013, 18:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2013, 18:14

Обработка глобальных исключений в службе
Добрый день! Подскажите пожалуйста. Не получается сделать обработку...

Как в службе Windows работать с реестром?
Написал прогу под консольку, чтоб вытаскивала значения из реестра,...

Передача данных от приложения службе Windows
Уважаемые знатоки, подскажите пожалуйста, как мне правильнее или вообще хоть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru