启动窗口服务的多个实例

时间:2017-02-22 15:46:09

标签: c# .net service windows-services window

我创建了一个Windows服务,它读取IBM MQ消息并对其进行处理。我的Win服务目前设计为OnStart,它触发一个定时器间隔,该间隔调用调用该类的函数完成所有工作(参见下面的代码)。

我想要完成的是缩放(如果这是正确的话)应用程序,如果要处理的队列中有很多消息,我们希望运行该服务的多个实例/线程。理想的情况是在app.config中使用某种类型的配置来指示要运行的线程或工作进程的数量。穿线是正确的方法吗?有更好或更好的方式吗?现在我们正在做的是安装一个具有不同名称的服务的新实例,它变得安静乏味。

    protected override void OnStart(string[] args)
    {
        eventLog1.WriteEntry("Service Started", EventLogEntryType.Information);

        _myTimer.Interval = 500; // half a second
        _myTimer.Elapsed += OnTimer;
        _myTimer.AutoReset = false;
        _myTimer.Enabled = true;
    }

    public void OnTimer(object sender, ElapsedEventArgs args)
    {
        //If you want the main program to go ahead and shut down after some period of time, regardless of whether it's obtained the lock, use Monitor.TryEnter. For example, this will wait 15 seconds.
        //bool gotLock = Monitor.TryEnter(_timerLock, TimeSpan.FromSeconds(15));

        if (!Monitor.TryEnter(_timerLock))
        {
            // something has the lock. Probably shutting down.
            return;
        }
        try
        {
            MqSyncJob mqSyncJob = new MqSyncJob(eventLog1);
            mqSyncJob.ProcessSyncJobQueue();                
        }
        catch (Exception ex)
        {
            eventLog1.WriteEntry(ex.ToString(), EventLogEntryType.Error);
        }
        finally
        {
            _myTimer.Start(); // re-enables the timer
            Monitor.Exit(_timerLock);
        }
    }

0 个答案:

没有答案