一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 使用Topshelf組件構建簡單的Windows服務

使用Topshelf組件構建簡單的Windows服務

2020-04-28 12:08彭澤0902 ASP.NET教程

這篇文章主要為大家詳細介紹了使用Topshelf組件構建簡單的Windows服務,具有一定的參考價值,感興趣的小伙伴們可以參考一下

 很多時候都在討論是否需要了解一個組件或者一個語言的底層原理這個問題,其實我個人覺得,對于這個問題,每個人都有自己的看法,個人情況不同,選擇的方式也就會不同了。我個人覺得無論學習什么,都應該嘗試著去了解對應的原理和源碼(這里就不要急著吐槽,容我說完)。對底層的了解不是為了讓你寫出類似的東西,讓你寫也不可能寫的出來,重寫一個就需要以此修改整個底層結構,了解底層知識只是為了讓你可以在寫業務代碼時,選擇合適的方式,以此使底層與業務層配合達到效率最佳。任何一種方式有壞有好,需要合適的選擇。

  如果覺得樓主以上的說法不對,或者有些不妥,還望見諒,因為爭論一個觀點沒有意義,認為對的人自己會去理解,認為不對的,可以忽略。沒有這個必要去花費時間和精力取討論這種事情。

  以上是扯淡,下面切入正題。前面介紹了一個組件Hangfire,用于設置定時任務等等操作,在這里介紹另一款組件Topshelf。

一.Topshelf組件概述

   Topshelf是.NET平臺的Windows服務框架。Topshelf可以輕松創建Windows服務,測試服務,調試服務,并最終將其安裝到Windows服務控制管理器(SCM)中。Topshelf通過允許開發人員專注于服務邏輯,而不是與.NET框架中的內置服務支持交互的細節。開發人員不需要了解服務類的復雜細節,通過InstallUtil執行安裝,或者了解如何將調試器附加到服務以進行故障排除問題。

   創建Windows服務與創建控制臺應用程序類似,控制臺應用程序創建后,創建一個具有公共Start和Stop方法的單一服務類。服務操作的方式較多,自動,自動(延遲),手動和禁用啟動選項本地系統,本地服務,網絡服務,用戶名/密碼或安裝期間提示的服務憑證。服務啟動依賴項,包括SQL Server,MSMQ和其他具有不同服務名稱的多實例服務安裝服務恢復選項,包括重新啟動,重新引導或運行程序。Topshelf與Mono合作,可以將服務部署到Linux。服務安裝功能目前僅限Windows。

二.Topshelf用法說明

      介紹完對應的組件背景概述,在這里就要介紹一下如何使用這個組件的使用方法。該組件的使用方法有另個方法,都在HostFactory類中,下面具體的介紹一個使用方式。

1.配置新的服務主機

?
1
2
3
4
5
6
7
8
9
10
11
HostFactory.New(x =>
        {
          // 可以定義不需要接口依賴性的服務,這只是為了
          //在此示例中顯示并未使用。
          x.Service<SampleSansInterfaceService>(s =>
            {
              s.ConstructUsing(() => new SampleSansInterfaceService());
              s.WhenStarted(v => v.Start());
              s.WhenStopped(v => v.Stop());
            });
        });

2.配置和運行新的服務主機,處理任何異常并將其寫入日志

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
HostFactory.Run(x =>
        {
          x.UseLog4Net("log4net.config");
          x.UseAssemblyInfoForServiceInfo();
          bool throwOnStart = false;
          bool throwOnStop = false;
          bool throwUnhandled = false;
          x.Service(settings => new SampleService(throwOnStart, throwOnStop, throwUnhandled), s =>
          {
            s.BeforeStartingService(_ => Console.WriteLine("BeforeStart"));
            s.BeforeStoppingService(_ => Console.WriteLine("BeforeStop"));
          });
          x.SetStartTimeout(TimeSpan.FromSeconds(10));
          x.SetStopTimeout(TimeSpan.FromSeconds(10));
          x.EnableServiceRecovery(r =>
            {
              r.RestartService(3);
              r.RunProgram(7, "ping google.com");
              r.RestartComputer(5, "message");
 
              r.OnCrashOnly();
              r.SetResetPeriod(2);
            });
          x.AddCommandLineSwitch("throwonstart", v => throwOnStart = v);
          x.AddCommandLineSwitch("throwonstop", v => throwOnStop = v);
          x.AddCommandLineSwitch("throwunhandled", v => throwUnhandled = v);
          x.OnException((exception) =>
          {
            Console.WriteLine("Exception thrown - " + exception.Message);
          });
        });

3.Topshelf配置操作方法

使用Topshelf組件構建簡單的Windows服務

三.Topshelf核心對象解析

承接上文,介紹完畢相關背景和常規操作,在這里介紹一個核心對象的一些方法。

1.HostFactory.New():

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public static Host New(Action<HostConfigurator> configureCallback)
    {
      try
      {
        if (configureCallback == null)
          throw new ArgumentNullException("configureCallback");
        var configurator = new HostConfiguratorImpl();
        Type declaringType = configureCallback.Method.DeclaringType;
        if (declaringType != null)
        {
          string defaultServiceName = declaringType.Namespace;
          if (!string.IsNullOrEmpty(defaultServiceName))
            configurator.SetServiceName(defaultServiceName);
        }
        configureCallback(configurator);
        configurator.ApplyCommandLine();
        ConfigurationResult result = ValidateConfigurationResult.CompileResults(configurator.Validate());
        if (result.Message.Length > 0)
        {
          HostLogger.Get(typeof(HostFactory))
               .InfoFormat("Configuration Result:\n{0}", result.Message);
        }
        return configurator.CreateHost();
      }
      catch (Exception ex)
      {
        HostLogger.Get(typeof(HostFactory)).Error("An exception occurred creating the host", ex);
        HostLogger.Shutdown();
        throw;
      }
    }

該方法用于配置新的服務主機,方法接受一個參數Action<HostConfigurator>配置方法調用,該方法返回Host對象,表示Topshelf服務主機,準備運行。 configureCallback.Method.DeclaringType;用于獲取聲明該成員的類。declaringType.Namespace;用于獲取獲取 System.Type 的命名空間。ValidateConfigurationResult.CompileResults(configurator.Validate());用于驗證配置結果。

2.HostFactory.Run():

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static TopshelfExitCode Run(Action<HostConfigurator> configureCallback)
    {
      try
      {
        return New(configureCallback)
          .Run();
      }
      catch (Exception ex)
      {
        HostLogger.Get(typeof(HostFactory))
             .Error("The service terminated abnormally", ex);
        HostLogger.Shutdown();
        
        return TopshelfExitCode.AbnormalExit;
      }
    }

該方法是一個靜態方法,配置和運行新的服務主機,處理任何異常并將其寫入日志。該方法接收一個參數Action<HostConfigurator> configureCallback配置方法調用,返回應用程序主方法返回的進程的退出代碼。

四.總結

以上是介紹如何使用Topshelf組件創建簡單的Windows服務的方法,在這里只是一個簡單的介紹,沒有很深入的介紹,如果需要了解更多的東西,可以看源碼,畢竟是開源免費的組件,也是一個很不錯的組件。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/pengze0902/p/6602737.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品国产免费 | 精品国产成a人在线观看 | 欧美精品成人a多人在线观看 | ccc在线在线36| 国产精品香蕉夜间视频免费播放 | 美女私人影院 | 青草视频在线观看视频 | 欧美视频精品一区二区三区 | 精品亚洲综合久久中文字幕 | 91麻豆精东果冻天美传媒老狼 | 免费看a视频 | 91精品啪在线观看国产老湿机 | a天堂中文在线 | 美妇在男人胯下哀求 | 果冻传媒在线视频播放观看 | 特级av毛片免费观看 | 91制片厂制作传媒免费版樱花 | 四虎影视最新 | 欧美视频在线一区 | 久久嫩草影院网站 | 天天做天天爱天天一爽一毛片 | 动漫美女羞羞 | 欧美理论片手机在线观看片免费 | 欧美在线视频一区 | 日本国产一区二区三区 | 午夜精品久久久久久久99蜜桃i | 高跟丝袜麻麻求我调教 | 草草视频免费观看 | 欧美伦乱| 91久久夜色精品国产九色 | 亚洲高清一区二区三区久久 | 91香蕉视频在线观看 | 精精国产xxxx视频在线播放器 | 17岁俄罗斯csgo| 视频在线免费看 | 香蕉精品高清在线观看视频 | 亚洲精品久久久久AV无码 | 久草在线福利资站免费视频 | 久久内在线视频精品mp4 | 九九99在线视频 | 亚洲v日韩v欧美在线观看 |