89530
TopShelfを使用するとコンソールアプリが永続サービス化する認識です。  
コンソールアプリの外側からアプリ終了すれば、TopShelfのWhenStopedイベントが検知するので問題なく終了できます。  
しかし、アプリ内部のイベントでアプリ終了したい場合、TopShelfのイベントループを終わらせる指示をアプリ内部から発行しないといけないと考えていますが、その手段が分かりません。

環境：Visualstudio2019、C＃、TopShelf 4.3.1-develop.253
CC BY-SA 4.0
2022-06-22T01:55:54.940
89515
2022-06-23T00:04:06.223
32228
question
c#
TopShelfでアプリ内部からアプリ終了する手段が知りたい
以下解決手段です。コードサンプルとシーケンスを添付します。

1.TopShelfのWhenStartedイベント時に動作する、XXXXServiceクラスのStart()の引数でHostControlのインスタンスを渡す。  
HostControlはTopShelfのイベントループを操作できるクラスのようです。  
2.XXXXServiceクラスではStart()時に渡されたHostControlインスタンスを、内部に保持しておく  
3.アプリ終了したいタイミングでHostControl.stop()を呼ぶ  
4.WhenStoppedイベントに定義したXXXXService.Stop()が呼ばれ、XXXXService.Stop()の処理終了と同時にアプリ終了する

**コードサンプル**

```

        public class Program
    {
        static void Main(string[] args)
        {
            HostFactory.Run(x =>
            {
                x.Service<XXXXService>(s =>
                {
                    s.ConstructUsing(name => new XXXXService());
                    s.WhenStarted((service, hostControl) =>
                    {
                        return service.Start(hostControl);
                    });
                    s.WhenStopped(service => service.Stop());
                });
                //Windowsサービスの設定
               x.RunAsLocalSystem();
                x.SetDescription("This is XXXXService");
                x.SetDisplayName("XXXXService");
                x.SetServiceName("XXXXService");
            });
        }
    }
    
```

**アプリ内部からの終了シーケンス**

[![TopShelf
アプリ内部からの終了シーケンス](https://i.stack.imgur.com/Cx9Rj.png)](https://i.stack.imgur.com/Cx9Rj.png)
CC BY-SA 4.0
2022-06-23T00:04:06.223
89530
2022-06-23T00:04:06.223
32228
89515
answer