0

私のサービスは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サービスでシャットダウンできないのはなぜですか?

インストールされているサービスを停止しようとすると、このエラーが発生します ここに画像の説明を入力してください

4

1 に答える 1

1

最も明白なエラーはここにありますOnStop

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!)newを作成したコードも削除しました。タイマーを確立して終了するだけなThreadのでThreadMain、それを独自のスレッドに配置する理由はありません。

于 2013-01-30T08:08:53.353 に答える