C# 在我实现线程后,我的windows服务无法停止
我的服务是由wix安装的,启动时一切正常,在向服务中添加线程之前,我的工作正常,因此可能我没有正确关闭线程 这是服务C# 在我实现线程后,我的windows服务无法停止,c#,multithreading,windows-services,C#,Multithreading,Windows Services,我的服务是由wix安装的,启动时一切正常,在向服务中添加线程之前,我的工作正常,因此可能我没有正确关闭线程 这是服务 public class WCFWindowsService : ServiceBase { public ServiceHost serviceHost = null; public WCFWindowsService() { // Name the Windows Service ServiceName = "Serv
public class WCFWindowsService : ServiceBase
{
public ServiceHost serviceHost = null;
public WCFWindowsService()
{
// Name the Windows Service
ServiceName = "ServiceName";
}
public static void Main()
{
ServiceBase.Run(new WCFWindowsService());
}
protected override void OnStart(string[] args)
{
ThreadTheClass T = new ThreadTheClass();
if (serviceHost != null)
{
serviceHost.Close();
}
Thread _thread = new Thread(T.ThreadMain);
_thread = new Thread(T.ThreadMain);
_thread.Start();
serviceHost = new ServiceHost(typeof(ProjectWCF.WCFService));
serviceHost.Open();
}
protected override void OnStop()
{
ThreadTheClass T = new ThreadTheClass();
if (serviceHost != null)
{
WCFWindowsService ThreadPost = new WCFWindowsService();
T.ThreadStop();
serviceHost.Close();
serviceHost = null;
}
}
}
还有线程类
class ThreadTheClass
{
System.Threading.Timer MyTimer;
public void ThreadMain()
{
int Minutes = 2;
MyTimer = new System.Threading.Timer((s) =>
{
Logic();
}
, null, 5000, Minutes * 100 * 60);
}
public void ThreadStop()
{
MyTimer.Dispose();
}
void Logic()
{
//do things every two minutes
}
我不知道什么是错误的,因为当我在控制台中尝试此程序时,ThreadStop()
工作正常并关闭线程,所以为什么它不能在windows服务中关闭
当我尝试停止已安装的服务时,会出现此错误
最明显的错误在这里,在顶部的
中:
ThreadTheClass T = new ThreadTheClass();
这将创建ThreadTheClass
的新实例。其中MyTimer
将为null
相反,在OnStart
方法中,您需要存储正在那里创建的实例,以便OnStop
可以访问相同的实例
ThreadTheClass T;
protected override void OnStart(string[] args)
{
T = new ThreadTheClass();
if (serviceHost != null)
{
serviceHost.Close();
}
T.ThreadMain();
serviceHost = new ServiceHost(typeof(ProjectWCF.WCFService));
serviceHost.Open();
}
protected override void OnStop()
{
if (serviceHost != null)
{
WCFWindowsService ThreadPost = new WCFWindowsService();
T.ThreadStop();
serviceHost.Close();
serviceHost = null;
}
}
我还删除了创建(2!)新Thread
s的代码-因为ThreadMain
只是建立了一个计时器,然后退出,所以没有理由把它放在自己的线程上。线程逻辑中有很多错误。我不知道从哪里开始。如果一切正常,为什么要尝试添加其他线程?我需要一个新线程,以便在另一个线程准备好进行WCF-Soap调用时,每5分钟向Web页面发送POST:s。这样,客户端就可以从我安装程序的位置知道外部IP。谢谢,我会测试这个!我看到了你们的两条线的观点。这很有帮助