多个Windows Service 传递给ServiceBase时,只运行其中一个。

malipeng0086 2013-12-31 10:12:42
在开发windows service的时候,在同一个项目中开发了三个service,但是成功安装之后,发现,无论我启用哪一个,都会执行其中一个service的程序,我的程序是这样的:
static void Main()
{
ServiceBase[] ServicesToRun = new ServiceBase[]
{
new Service1(),
new Service2(),
new Service3()
};
ServiceBase.Run(ServicesToRun);
}

这是我的程序入口,在每一个service的开头我都会在文件里面写入日志信息,表示这个service已经被执行了。在service1的OnStart方法的开头,我写如文件”Service1 has been exeuted”,在service2的OnStart的开头在文件里写入“Service2 has been executed”, 在Service3的OnStart的开头在文件里写入“Service3 has been executed。用这些日志来标示服务有被执行。但是当我成功安装这三个服务之后,在服务管理器里面,手动启用这三个服务时,发现写入日志的是”Service1 has been exeued“ 这条日志被执行了三次, 其它两条日志没有被记录。但是如果我把服务入口函数写成:
static void Main()
{
ServiceBase[] ServicesToRun = new ServiceBase[]
{
new Service1()
};
ServiceBase.Run(ServicesToRun);
}


static void Main()
{
ServiceBase[] ServicesToRun = new ServiceBase[]
{
new Service2()
};
ServiceBase.Run(ServicesToRun);
}

static void Main()
{
ServiceBase[] ServicesToRun = new ServiceBase[]
{
new Service3()
};
ServiceBase.Run(ServicesToRun);
}

这三种写法的时候,又可以单独的把日志记进文件的,不知道为什么,请大家帮忙!
...全文
243 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
malipeng0086 2014-01-01
  • 打赏
  • 举报
回复
引用 12 楼 sp1234 的回复:
我真的很怀疑你是否调试跟踪过程序,怎么你是靠猜、而连“调用WriterExceptionMessageToLog ”的代码都不知道贴出来呢?

WriterExceptionMessageToLog("log text.");
就是这样传递的,大神,这应该不会有问题吧。
本拉灯 2014-01-01
  • 打赏
  • 举报
回复
问题都不懂怎么问,让人怎么答。。
  • 打赏
  • 举报
回复
我真的很怀疑你是否调试跟踪过程序,怎么你是靠猜、而连“调用WriterExceptionMessageToLog ”的代码都不知道贴出来呢?
  • 打赏
  • 举报
回复
引用 9 楼 malipeng0086 的回复:
msg 都是一些调试信息,记录程序已经执行到什么位置,是一些字符串常量。
说知道你是如何把你说的“常量”传给 WriterExceptionMessageToLog 方法的呢?
本拉灯 2014-01-01
  • 打赏
  • 举报
回复
代码贴全一点呀,这样看让人猜?
malipeng0086 2014-01-01
  • 打赏
  • 举报
回复
引用 8 楼 sp1234 的回复:
[quote=引用 3 楼 malipeng0086 的回复:] [quote=引用 2 楼 happy09li 的回复:] 日志时在每一个Service的OnStart方法里写的,就写在OnStart开始的时候,标注一下程序已经进入了。 代码如下:
#2楼说的不是你的 WriterExceptionMessageToLog 方法内容是什么,而是问你是如何调用 WriterExceptionMessageToLog 这个方法的。说得更明确一点,就是 msg 参数在传给这个方法之前是怎样生成的。[/quote] msg 都是一些调试信息,记录程序已经执行到什么位置,是一些字符串常量。 在windows事件查看器里我看到一个细节,发现service1,service2,service3的事件ID都是0。
  • 打赏
  • 举报
回复
引用 3 楼 malipeng0086 的回复:
[quote=引用 2 楼 happy09li 的回复:] 日志时在每一个Service的OnStart方法里写的,就写在OnStart开始的时候,标注一下程序已经进入了。 代码如下:
#2楼说的不是你的 WriterExceptionMessageToLog 方法内容是什么,而是问你是如何调用 WriterExceptionMessageToLog 这个方法的。说得更明确一点,就是 msg 参数在传给这个方法之前是怎样生成的。
malipeng0086 2014-01-01
  • 打赏
  • 举报
回复
引用 5 楼 gomoku 的回复:
这样的logging有问题: 最主要的是同步问题 - 多个线程同时调用(比如多个service OnStart)时可能出现异常,而异常又被你掩盖了(//do nothing)。
仔细想了一下,问题应该不是出在这里,如果是多线程的问题的话,至少如果我单单启动一个service的话,应该可以执行才对,现在是无论执行哪一个服务,都进入了service1的OnStart方法。感觉好奇怪啊,应该是那个地方我没有弄好,但是到底是哪里啊,大神,教教我!!
gomoku 2013-12-31
  • 打赏
  • 举报
回复
这样的logging有问题: 最主要的是同步问题 - 多个线程同时调用(比如多个service OnStart)时可能出现异常,而异常又被你掩盖了(//do nothing)。
malipeng0086 2013-12-31
  • 打赏
  • 举报
回复
引用 2 楼 happy09li 的回复:
你那样写是没问题的,是不是记日志的地方有问题?
Service进入的时候,都调用上述方法记的日志。
malipeng0086 2013-12-31
  • 打赏
  • 举报
回复
引用 2 楼 happy09li 的回复:
你那样写是没问题的,是不是记日志的地方有问题?
日志时在每一个Service的OnStart方法里写的,就写在OnStart开始的时候,标注一下程序已经进入了。 代码如下:

static public void WriterExceptionMessageToLog(string msg, bool isDebug=true)
        {
            string attachInfo = "";
            if (!isDebug || config.LogDebug)
            {
                try
                {
                    using (FileStream fs = new FileStream(@"C:\DataDispatcherLog.log", FileMode.Append, FileAccess.Write))
                    {
                        using (StreamWriter sw = new StreamWriter(fs))
                        {
                            sw.WriteLine(string.Format("[{2}] {0:yyyy-MM-dd HH:mm:ss}:{1}", DateTime.Now, msg, isDebug? "[DEBUG]" : "INFO"));
                        }
                    }
                }
                catch (IOException ex)
                {
                    //do nothing.
                }
            }
        }

熙风 2013-12-31
  • 打赏
  • 举报
回复
你那样写是没问题的,是不是记日志的地方有问题?
malipeng0086 2013-12-31
  • 打赏
  • 举报
回复
在线等着,着急用,大家帮帮我,谢谢啦!!!!
malipeng0086 2013-12-31
  • 打赏
  • 举报
回复
引用 5 楼 gomoku 的回复:
这样的logging有问题: 最主要的是同步问题 - 多个线程同时调用(比如多个service OnStart)时可能出现异常,而异常又被你掩盖了(//do nothing)。
有道理,这里需要用线程锁,但是问题貌似不是出在这里啊。 为什么我同时启动三个service的时候,Service1被进入了三次,其它一次都没有。

110,568

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧