小弟使用C#写了个Windows服务,把代码放在控制台程序跑,没什么问题,但就是在服务里,然后添加服务的时候就启动不起来,老是提示这个错误:
代码如下:
protected override void OnStart(string[] args) {while (true) { var databaseModels = MongoDBHelper.Select<DataBaseServerConfigures>(Query.EQ("SystemAddress", BsonValue.Create(systemAddress)), MongoConnType.Center); var dataModel = MongoDBHelper.Get<ActivityConfigures>(Query.EQ("ActivityName", BsonValue.Create("系统Ping设置")), MongoConnType.Center); if (databaseModels.Count > 0) { if (dataModel != null) { foreach (var item in databaseModels) { MongoDBHelper.Insert<SystemPing>( new SystemPing() { ThisIP = prohelper.GetIPAddress(), PingIP = item.DataBaseName, SystemAddress = item.SystemAddress, Status = prohelper.GetSystemPing(item.DataBaseName), DateTimeNow = DateTime.Now }, MongoConnType.Center); } Thread.Sleep(dataModel.TntervalSecond); } else { foreach (var item in databaseModels) { MongoDBHelper.Insert<SystemPing>( new SystemPing() { ThisIP = prohelper.GetIPAddress(), PingIP = item.DataBaseName, SystemAddress = item.SystemAddress, Status = prohelper.GetSystemPing(item.DataBaseName), DateTimeNow = DateTime.Now }, MongoConnType.Center); } Thread.Sleep(30000); } } } }
什么原因啊?望大神帮忙看下!!
不能在OnStart里面直接死循环,可以把过程甩给一个线程去做。启动是有超时时间的,一旦过了超时时间onStart没有没有结束的话,服务就启动失败了。
大神,Parallel.Invoke不也是类似于thread么?也是一个线程啊,这样写也会报错。。。
@猫出没: Parallel是一个支持并行的类,就是把所有工作分配到CPU线程执行,并行的同时是卡主线程的。Invoke的作用就是把工作交给主线程去做,你可以使用System.Threading.Tasks.Task.Factory.StartNew()这个方法去开启并执行一个线程。
@Hoze: 有点晕乎,StartNew()这个方法不就是开启一个线程么?他有主子之分么?
给这个服务管理员权限试试
能说具体点吗?是
这两个的属性配置么?
@猫出没: 跟代码没关系.修改运行的用户.在服务里.
@吴瑞祥: 不行,跟这个没有关系,试过了,他这个如果改成线程开启就没问题,直接while就卡死。。。真奇怪,,难不成是超时还是怎么??