这是我的主要内容:
static class Program
{
static void Main()
{
//Debugger.Launch();
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service1()
};
ServiceBase.Run(ServicesToRun);
}
}
这是我的Service1()
代码:
public partial class Service1 : ServiceBase
{
public Service1()
{
Thread messageThread = new Thread(new ThreadStart(Messaggi.Check));
messageThread.Start();
bool checkGruppoIndirizzi = true;
for (; ; )
{
SediOperative.Check();
Autisti.Check();
AutistiVeicoli.Check();
StatiVega.Check();
int res = Ordini.Check();
if (res == 0) AssegnazioniVega.Check();
Thread.Sleep(10000);
}
}
protected override void OnStart(string[] args)
{
}
protected override void OnStop()
{
}
}
首先,我不知道以这种方式启动两个线程是一件好事,但真正的问题是程序在Visual Studio中运行良好但安装后(我使用InstallShield创建了一个安装项目)我尝试从Windows服务面板启动我的服务,然后得到:
Error 1053: The service did not respond to the start or control request in a timely fashion
答案 0 :(得分:1)
您遇到的问题是,在susyem调用Start方法并且已成功返回后,您的服务将成功启动。鉴于你在构造函数中有一个无限循环,系统会对自己说“甚至不能创建这个,更不用说调用start了。我放弃了。”
您的代码应按以下方式重构:
public partial class Service1 : ServiceBase
{
public Service1()
{
}
private Thread messageThread;
private Thread otherThread;
private bool stopNow;
protected override void OnStart(string[] args)
{
this.stopNow = false;
this.messageThread = new Thread(new ThreadStart(Messaggi.Check));
this.messageThread.Start();
this.otherThread = new Thread(new ThreadStart(this.StartOtherThread));
this.otherThread.Start();
}
private void StartOtherThread()
{
bool checkGruppoIndirizzi = true;
while (this.stopNow == false)
{
SediOperative.Check();
Autisti.Check();
AutistiVeicoli.Check();
StatiVega.Check();
int res = Ordini.Check();
if (res == 0) AssegnazioniVega.Check();
for (int 1 = 0; i < 10; i++)
{
if (this.stopNow)
{
break;
}
Thread.Sleep(1000);
}
}
}
}
protected override void OnStop()
{
this.stopNow = true;
this.messageThread.Join(1000);
this.otherThread.Join(1000);
}
}
是的,在Threads上启动东西正是这样做的!你必须有一些方法在Stop()方法中停止它们。 (上面的代码是空气代码所以不要相信它。)对于'otherThread'我已经检查了一个bool并在bool设置时退出。线程。加入只是一个整洁,这不是绝对必要的,但我认为是很好的管家。
干杯 -