国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

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

來源:懂視網 責編:小采 時間:2020-11-27 22:35:55
文檔

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

使用Topshelf組件構建簡單的Windows服務: 很多時候都在討論是否需要了解一個組件或者一個語言的底層原理這個問題,其實我個人覺得,對于這個問題,每個人都有自己的看法,個人情況不同,選擇的方式也就會不同了。我個人覺得無論學習什么,都應該嘗試著去了解對應的原理和源碼(這里就不要急著吐槽,
推薦度:
導讀使用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.配置新的服務主機

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

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

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核心對象解析

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

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

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

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

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

四.總結

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

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

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

使用Topshelf組件構建簡單的Windows服務: 很多時候都在討論是否需要了解一個組件或者一個語言的底層原理這個問題,其實我個人覺得,對于這個問題,每個人都有自己的看法,個人情況不同,選擇的方式也就會不同了。我個人覺得無論學習什么,都應該嘗試著去了解對應的原理和源碼(這里就不要急著吐槽,
推薦度:
標簽: 服務 簡單 組件
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 精品视频在线观看视频免费视频 | 多人伦精品一区二区三区视频 | 精品一区二区视频 | 国产精品免费在线播放 | 精品久久久久中文字幕日本 | 亚洲视频在线免费观看 | 国产精品麻豆视频 | 成人区精品一区二区毛片不卡 | 亚洲色图在线播放 | 亚洲欧美日韩中文字幕在线 | 国产精品亚洲精品日韩动图 | 亚洲视频免费观看 | 精品在线一区二区 | 国产精品视频一区二区三区 | 久久国产一级毛片一区二区 | 一区二区三区高清不卡 | 久久久久久久久久久9精品视频 | 一区二区三区视频在线 | 精品久久久久久中文字幕 | 99精品国产高清一区二区三区香蕉 | 国产成人精品一区二三区在线观看 | 国产精品亚洲一区二区三区在线播放 | 精品国产a | 九九久久国产精品大片 | 国产精品自拍第一页 | 国产全黄a一级毛片视频 | 日韩欧美在线视频 | 国产成人综合一区精品 | 可以看的毛片网站 | 我被公睡做舒服爽中文字幕 | 日本一区二区三区在线播放 | 亚洲欧洲日韩在线 | 国产成人久久精品亚洲小说 | 国产第一页视频 | 亚洲国产精品免费 | 亚洲国产精品成人综合久久久 | 国产欧美另类 | 久久成人国产精品二三区 | 国内精品免费 | 欧美在线精品一区二区三区 | 四虎精品成人a在线观看 |