Почему не срабатывает обратный вызов System.Threading.Timer? - PullRequest
1 голос
/ 14 января 2011

Я не с помощью Windows Form Timer - я использую System.Threading.Timer.Никаких исключений не возникает при создании экземпляра таймера, и, насколько я понимаю, System.Threading.Timer не нужно явно запускать.

Я пытался использовать System.Timers.Timer (см. Комментарии в коде)и изменение подписи обратного вызова без удачи.Внутри метода обратного вызова я заглушил некоторые записи EventLog, и даже не первые записи в журнал событий.Все, что я вижу в журнале событий, - это MyService.OnStart, который запускается, а затем запускается MyService (оба из события OnStart).Почему не запускаются события обратного вызова таймера?

public partial class MyService : ServiceBase
{

    private static System.Threading.Timer timer;

    public MyService()
    {
        InitializeComponent();
        if (!System.Diagnostics.EventLog.SourceExists("MyService"))
        {
            System.Diagnostics.EventLog.CreateEventSource(
                "MyService", "MyServiceLog");
        }
        eventLog1.Source = "MyService";
        eventLog1.Log = "MyServiceLog";
    }

    protected override void OnStart(string[] args)
    {
        eventLog1.WriteEntry("MyService.OnStart event fired");

        // setup timer to poll and execute an event
        //Timer timer = new Timer(new TimerCallback(CheckCalls), null, 0, 10000);
        try
        {
            timer = new System.Threading.Timer(new System.Threading.TimerCallback(CheckCalls), null, 0, 10000);
        }
        catch (Exception ex)
        {
            eventLog1.WriteEntry(ex.Message + " Stacktrace: " + ex.StackTrace);
        }

        eventLog1.WriteEntry("MyServicestarted");

        GC.KeepAlive(timer);
    }
}

и метод обратного вызова CheckCalls:

private static void CheckCalls(object objectState)
    {
        EventLog eventLog1 = new EventLog("MyServiceLog", "DAVIDWIN7", "MyService");
            eventLog1.WriteEntry("MyService is polling");
    }

Arg - По какой-то причине, когда вы строите-> ОчиститьSolution, затем Build-> Build Solution, Visual Studio не перестраивает ваш проект установки.Я полагаю, что мой код выше работает нормально, но я пробовал много разных исправлений без явного щелчка правой кнопкой мыши по проекту установки и выбора Build.

Я думал, что Clean Solution заставит все проекты быть перестроены при следующей сборке ???

Ответы [ 3 ]

0 голосов
/ 15 января 2011

Должна быть ошибка при записи потока таймера в журнал событий.

У меня это работает на моем компьютере, но я заменил весь журнал событий на Console.writeline, потому что не хотел связываться с разрешениями журнала событий.

0 голосов
/ 15 января 2011

Пожалуйста, вы можете скачать это тестовое приложение, которое точно соответствует сценарию, о котором вы говорите:

https://docs.google.com/leaf?id=0Bw_NnV9fhgmgMThjNDgzOTgtODNiOC00NDE1LWEyMTYtNzVhOTMyNzlmZjZk&hl=en&authkey=CMuupNkC

Я только что создал это.Это сервис, который эффективно использует тот же код, что и вы.Единственное отличие состоит в том, что я использовал панель инструментов для перетаскивания журнала событий в конструктор служб - для настройки журнала было указано «Приложение», а для источника - «Сервис1».

Откройте командную строку VS впапку проекта, перейдите в bin\debug и запустите installutil windowsservice1.exe - указав некоторые учетные данные (поэтому вы устанавливаете службу dev непосредственно из выходной папки bin).

Запустите службу и просмотрите журнал приложения - этобудет писать каждые десять секунд, как вы ожидаете увидеть из своего кода.

Если предположить, что это работает на вашей машине (tm), как на моей машине (tm), то я бы предположил, что проблема заключается в самой регистрации событийили ужас ужасов - ваш сервис не запускается из выходной папки сборки (большинство разработчиков в моей команде настаивают на том, чтобы их сервисы запускались из другой папки, а затем клянутся, когда забывают обновить двоичные файлы при запускеотладка!).

Как я уже говорил в своем комментарии, вам действительно нужно иметь возможность прикрепитьотладчик этого и остановите обратный вызов, чтобы убедиться, что он не запущен.Я никогда не полагаюсь на журнал событий для диагностических сообщений просто потому, что журнал может быть переполнен, или разрешения могут помешать вам и т. Д. И т. Д. - это может быть компонент платформы Windows, но он не так надежен, как хотелось бы.

однако отладчик редко врет (если только развернутые двоичные файлы не устарели;)).Скомпилируйте отладочную версию своего проекта и убедитесь, что она установлена ​​в списке служб , запустите ее, а затем подключите непосредственно к файлу exe (нет смысла пытатьсяattach to [service] .vshost.exe - VS не может автоматически подключать или размещать службы Windows, так как единственный способ, которым они могут работать, это выполнить их через svchost.exe).

Надеюсь, это поможет.

0 голосов
/ 14 января 2011

Вы проверяли, имеет ли учетная запись, под которой работает служба, доступ к журналу событий?

...