Підкажіть по WinService (C#)

Недавно вперше вирішив написати він службу і наткнувся на її якусь дивну поведінку...

Ось частнина коду цього хелоуворда —


protected override void OnStart(string[] args)
        {
           StreamWriter writer = File.AppendText("C://1.txt");
           writer.WriteLine("begin");

Timer timer = new Timer();
           timer.Enabled = true;
           timer.Interval = 100;
           timer.Tick += new EventHandler(timer_Tick);
           timer.Start();

writer.WriteLine("end");
        }

void timer_Tick(object sender, EventArgs e)
        {
            StreamWriter writer = File.AppendText("C://1.txt");
            writer.WriteLine("timer");
            writer.Close();
        }

Проінсталював я її, запускаю, а реакції ноль! В файл нічого не записується, хоча якщо цей код запхати в Windows Form, то працюватиме! Не підкажете де промах?

Буду вдячний!

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

На самом деле можно создать GUI поток, но для этого нужно будет создавать форму. Вопрос только в том, зачем это в сервисе, если можно заюзать таймер из Threading?

проблема вирішена, питань більше немає

всім дописувачам вельми вдячний!:)

Твій таймер працює в GUI-потоці, якого віндовс-сервіс в принципі не має

Сервіси не можуть взаємодіяти з візуальними компонентами за замовчанням, тому ти мав або явно поставить пташку, щоб це дозволити, або використовувати інший таймер. Так, і таймер треба зробити полем, а не локальною змінною

а чому той не працював не знаєш?

Знаю, читай MSDN =)

Попробуй винести цей рядок

Timer timer = new Timer();

з OnStart в поле класу.

блін, в попередньому потсі під «цим таймером» мав на увазі таймер із threading!


А ти раптом не використовуєш Timer з Windows.Forms?
Ой, вибач!
Не знаю, що я там пробував, але з цим таймером зараз все працює!))
Дякую,

а чому той не працював не знаєш?


bool append = true;
            using (StreamWriter sw = new StreamWriter(@"C:\1.txt", append))
            {
                sw.WriteLine("blah2");
            }

Если файла нет — он будет перезаписан, но твой код тоже правильный.
Предположения — нет прав для записи в корень диска С: (Vista?), возможно нужно указать явно юзера из под которого будет запускаться сервис или попробовать записать в «My Documents». Могут быть проблемы с инсталятором — сейчас может быть заинстален старая версия сервиса — написать unistall и запускать сначала его, а потом install для сервиса.
Может быть где-то генерируется RuntimeError — посмотри в EventViewer, может там что увидишь

Таймер должен быть System.Threading.Timer, иначе тебе необходимо будет подключать сборку с WinForms, что может расширить круг для поиска ошибок. Таймер из формс — это всего лишь обертка для таймера из threading, так что нет смысла в подключении другой сборки


А ти раптом не використовуєш Timer з Windows.Forms?
цей таймер саме з Windows.Forms.

Але я пробував і таймер з threading. Результат той же: (


И еще советовал бы посмотреть в документации создает ли метод ’File.AppendText
новый файл или может только писать в уже существующий

такий файл я уже створив вручну, тому чи File.AppendText створює файл, чи лише записує в існуючий — не важливо.

Моя версия:
Неправильное обьявление имени файла, следует писать:
StreamWriter writer = File.AppendText («C: \\1.txt»); (то есть тоже самое только слеши в другую сторону)

якби проблема була в слешах, то код


StreamWriter writer = File.AppendText("C://1.txt");
writer.WriteLine("begin");
writer.Close();

, який стояв в OnStart перед обявленням таймера не працював би, а він то працює!

А ти раптом не використовуєш Timer з Windows.Forms?

Моя версия:
Неправильное обьявление имени файла, следует писать:
StreamWriter writer = File.AppendText («C: \\1.txt»); (то есть тоже самое только слеши в другую сторону)
И еще советовал бы посмотреть в документации создает ли метод ’File.AppendText

новый файл или может только писать в уже существующий


А не смущает, что в двух местах создается StreamWriter на один и тот же файл, причем первый явно не закрывается (а значит, висит в куче и ждет сборки мусора)? Ловите Exception в timer_Tick и смотрите что происходит.

мда, із StreamWriter я прогнав звичайно. Але навіть якщо його вчасно закрити або взагалі видалити із OnStart, то таймер всерівно не спрацьовує, тобто така фігня (дивись нижче) не працює...


protected override void OnStart(string[] args)
        {
           Timer timer = new Timer();
           timer.Enabled = true;
           timer.Interval = 100;
           timer.Tick += new EventHandler(timer_Tick);
           timer.Start();
        }

void timer_Tick(object sender, EventArgs e)
        {
            StreamWriter writer = File.AppendText("C://1.txt");
            writer.WriteLine("timer");
            writer.Close();
        }

Підписатись на коментарі