欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Topshelf組件構(gòu)建簡(jiǎn)單的Windows服務(wù)

 更新時(shí)間:2017年03月23日 08:37:27   作者:彭澤0902  
這篇文章主要為大家詳細(xì)介紹了使用Topshelf組件構(gòu)建簡(jiǎn)單的Windows服務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

  如果覺(jué)得樓主以上的說(shuō)法不對(duì),或者有些不妥,還望見(jiàn)諒,因?yàn)闋?zhēng)論一個(gè)觀點(diǎn)沒(méi)有意義,認(rèn)為對(duì)的人自己會(huì)去理解,認(rèn)為不對(duì)的,可以忽略。沒(méi)有這個(gè)必要去花費(fèi)時(shí)間和精力取討論這種事情。

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

一.Topshelf組件概述

   Topshelf是.NET平臺(tái)的Windows服務(wù)框架。Topshelf可以輕松創(chuàng)建Windows服務(wù),測(cè)試服務(wù),調(diào)試服務(wù),并最終將其安裝到Windows服務(wù)控制管理器(SCM)中。Topshelf通過(guò)允許開(kāi)發(fā)人員專注于服務(wù)邏輯,而不是與.NET框架中的內(nèi)置服務(wù)支持交互的細(xì)節(jié)。開(kāi)發(fā)人員不需要了解服務(wù)類的復(fù)雜細(xì)節(jié),通過(guò)InstallUtil執(zhí)行安裝,或者了解如何將調(diào)試器附加到服務(wù)以進(jìn)行故障排除問(wèn)題。

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

二.Topshelf用法說(shuō)明

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

1.配置新的服務(wù)主機(jī)

HostFactory.New(x =>
        {
          // 可以定義不需要接口依賴性的服務(wù),這只是為了
          //在此示例中顯示并未使用。
          x.Service<SampleSansInterfaceService>(s =>
            {
              s.ConstructUsing(() => new SampleSansInterfaceService());
              s.WhenStarted(v => v.Start());
              s.WhenStopped(v => v.Stop());
            });
        });

2.配置和運(yùn)行新的服務(wù)主機(jī),處理任何異常并將其寫(xiě)入日志

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核心對(duì)象解析

承接上文,介紹完畢相關(guān)背景和常規(guī)操作,在這里介紹一個(gè)核心對(duì)象的一些方法。

1.HostFactory.New():

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;
      }
    }

該方法用于配置新的服務(wù)主機(jī),方法接受一個(gè)參數(shù)Action<HostConfigurator>配置方法調(diào)用,該方法返回Host對(duì)象,表示Topshelf服務(wù)主機(jī),準(zhǔn)備運(yùn)行。 configureCallback.Method.DeclaringType;用于獲取聲明該成員的類。declaringType.Namespace;用于獲取獲取 System.Type 的命名空間。ValidateConfigurationResult.CompileResults(configurator.Validate());用于驗(yàn)證配置結(jié)果。

2.HostFactory.Run():

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;
      }
    }

該方法是一個(gè)靜態(tài)方法,配置和運(yùn)行新的服務(wù)主機(jī),處理任何異常并將其寫(xiě)入日志。該方法接收一個(gè)參數(shù)Action<HostConfigurator> configureCallback配置方法調(diào)用,返回應(yīng)用程序主方法返回的進(jìn)程的退出代碼。

四.總結(jié)

以上是介紹如何使用Topshelf組件創(chuàng)建簡(jiǎn)單的Windows服務(wù)的方法,在這里只是一個(gè)簡(jiǎn)單的介紹,沒(méi)有很深入的介紹,如果需要了解更多的東西,可以看源碼,畢竟是開(kāi)源免費(fèi)的組件,也是一個(gè)很不錯(cuò)的組件。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Request.UrlReferrer使用詳解

    Request.UrlReferrer使用詳解

    Request.UrlReferrer可以獲取客戶端上次請(qǐng)求的url的有關(guān)信息,接下來(lái)為大家詳細(xì)介紹下Request.UrlReferrer使用方法,感興趣的朋友可以參考下哈,希望對(duì)你有所幫助
    2013-04-04
  • asp.net中C#實(shí)現(xiàn)手動(dòng)回收內(nèi)存的方法

    asp.net中C#實(shí)現(xiàn)手動(dòng)回收內(nèi)存的方法

    這篇文章主要介紹了asp.net中C#實(shí)現(xiàn)手動(dòng)回收內(nèi)存的方法,包括System.GC.Collect方法的使用及緩存技術(shù)的分析,具有一定的實(shí)用價(jià)值,需要的朋友可以參考下
    2014-12-12
  • .net core利用orm如何操作mysql數(shù)據(jù)庫(kù)詳解

    .net core利用orm如何操作mysql數(shù)據(jù)庫(kù)詳解

    這篇文章主要給大家介紹了關(guān)于.net core利用orm如何操作mysql數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • asp.net web大文件上傳帶進(jìn)度條實(shí)例代碼

    asp.net web大文件上傳帶進(jìn)度條實(shí)例代碼

    web 大文件上傳 帶進(jìn)度條
    2008-10-10
  • c#生成圖片縮略圖的類(2種實(shí)現(xiàn)思路)

    c#生成圖片縮略圖的類(2種實(shí)現(xiàn)思路)

    4個(gè)重載方法,有直接返回Image對(duì)象的,有生成縮略圖,并且保存到指定目錄的,具體祥看下文
    2013-05-05
  • .net core日志結(jié)構(gòu)化

    .net core日志結(jié)構(gòu)化

    如果我們的日志結(jié)構(gòu)化了,那么可以使用elasticsearch 這樣的框架進(jìn)行二次整理,再借助一些分析工具。我們就能做到可視化分析系統(tǒng)的運(yùn)行情況,做到日志告警、上下文關(guān)聯(lián)、實(shí)現(xiàn)追蹤系統(tǒng)集成,同樣也易于檢索相關(guān)信息。本文講解的結(jié)構(gòu)化,借助需要借助serilog工具
    2021-06-06
  • ASP.NET(C#) 讀取EXCEL另加解決日期問(wèn)題的方法分享

    ASP.NET(C#) 讀取EXCEL另加解決日期問(wèn)題的方法分享

    這篇文章介紹了ASP.NET(C#) 讀取EXCEL另加解決日期問(wèn)題的方法,有需要的朋友可以參考一下
    2013-11-11
  • 官網(wǎng) Ext direct包中.NET版的問(wèn)題

    官網(wǎng) Ext direct包中.NET版的問(wèn)題

    下載了官網(wǎng)的 Ext direct 包進(jìn)行研究,發(fā)現(xiàn)服務(wù)器端返回結(jié)果存在一點(diǎn)小問(wèn)題。
    2009-06-06
  • .Net程序防止被注入代碼(整站通用)分享

    .Net程序防止被注入代碼(整站通用)分享

    防止sql注入,通常一個(gè)一個(gè)文件修改不僅麻煩而且還有漏掉的危險(xiǎn),下面我說(shuō)一上如何從整個(gè)系統(tǒng)防止注入
    2013-11-11
  • xUnit 編寫(xiě) ASP.NET Core 單元測(cè)試的方法

    xUnit 編寫(xiě) ASP.NET Core 單元測(cè)試的方法

    這篇文章主要介紹了xUnit 編寫(xiě) ASP.NET Core 單元測(cè)試的方法,文中代碼非常詳細(xì),幫助大家更好的參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06

最新評(píng)論