Topshelf創建Windows服務

在使用 Quartz.NET 做任務開始時碰到一個疑難問題,

就是IIS涉及了垃圾回收機制,quartz.net 在ASP.NET 項目中可以實現線程監控定時執行任務,但是在IIS7.5機一下版本中涉及到IIS的應用程序池在一段時間後被垃圾回收機制回收,從而導致quartz.net 配置的定時服務無法按時啓動。

IIS7.5,默認的垃圾回收時間間隔爲1740分鐘(=29h),29小時內未訪問該網站,IIS會將後臺的Quartz.net 的線程Kill掉。因此,出現許多的想法,例如:

  • 曲線救國,每天半夜定時訪問該網站,設置windows定時任務,訪問完臨時掐掉。—— 感覺不太靠譜,有點逆着IIS的機制
  • 那還是將任務調度寫入到windows服務裏,這樣就靠譜多了,只是特意寫windows服務繞路了,由此找到了Topshelf。

Topshelf是創建Windows服務的另一種方法。Topshelf是一個開源的跨平臺的宿主服務框架,支持Windows和Mono,只需要幾行代碼就可以構建一個很方便使用的服務宿主。

  • 官網:http://topshelf-project.com/ 這裏面有詳細的文檔及下載

  • Topshelf的代碼託管在 http://github.com/topshelf/Topshelf/downloads ,可以在這裏下載到最新的代碼。

  • 新建一個項目,只需要引用Topshelf.dll 即可,爲了日誌輸出顯示,建議也同時引用Topshelf.Log4Net。程序安裝命令

    • Install-Package Topshelf
    • Install-Package Topshelf.Log4Net

使用案例

官網文檔地址:http://docs.topshelf-project.com/en/latest/configuration/quickstart.html

public class TownCrier
{
    readonly Timer _timer;
    public TownCrier()
    {
        _timer = new Timer(1000) {AutoReset = true};
        _timer.Elapsed += (sender, eventArgs) => Console.WriteLine("It is {0} and all is well", DateTime.Now);
    }
    public void Start() { _timer.Start(); }
    public void Stop() { _timer.Stop(); }
}

public class Program
{
    public static void Main()
    {
        var rc = HostFactory.Run(x =>                                   //1
        {
            x.Service<TownCrier>(s =>                                   //2
            {
               s.ConstructUsing(name=> new TownCrier());                //3
               s.WhenStarted(tc => tc.Start());                         //4
               s.WhenStopped(tc => tc.Stop());                          //5
            });
            x.RunAsLocalSystem();                                       //6

            x.SetDescription("Sample Topshelf Host");                   //7
            x.SetDisplayName("Stuff");                                  //8
            x.SetServiceName("Stuff");                                  //9
        });                                                             //10

        var exitCode = (int) Convert.ChangeType(rc, rc.GetTypeCode());  //11
        Environment.ExitCode = exitCode;
    }
}

配置運行

沒錯,整個程序已經開發完了,接下來,只需要簡單配置一下,即可以當服務來使用了。安裝很方便:
安裝:TopshelfDemo.exe install
啓動:TopshelfDemo.exe start
卸載:TopshelfDemo.exe uninstall

參考:https://www.cnblogs.com/jys509/p/4614975.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章