C# 在我实现线程后,我的windows服务无法停止

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

我的服务是由wix安装的,启动时一切正常,在向服务中添加线程之前,我的工作正常,因此可能我没有正确关闭线程

这是服务

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。谢谢,我会测试这个!我看到了你们的两条线的观点。这很有帮助