Dotnet Core Windows Service

来源:https://www.cnblogs.com/jfliuyun/archive/2018/01/08/8242945.html
-Advertisement-
Play Games

在dotnet 中有topshelf 可以很方便的寫windows 服務並且安裝也是很方便的,命令行 運行.exe install 就直接把exe 程式安裝成windows 服務。當然 代碼也要做相應的修改,具體的可以參照例子。 在dotnet core 2.0 中 我們也有一個很方便的dll 來試 ...


在dotnet 中有topshelf 可以很方便的寫windows 服務並且安裝也是很方便的,命令行 運行.exe install 就直接把exe 程式安裝成windows 服務。當然

代碼也要做相應的修改,具體的可以參照例子。

在dotnet core 2.0 中 我們也有一個很方便的dll 來試用 

https://github.com/PeterKottas/DotNetCore.WindowsService

通過Nuget來安裝 Using nuget: Install-Package PeterKottas.DotNetCore.WindowsService

方便多個服務我們先定義一個介面

public interface IBaseService
{
void Start();
void Stop();
}

具體的實現呢 我舉個例子,在例子中我們試用了個Timer,定時的完成某些任務,這樣 我們就可以同時寫好幾個service 只要繼續 IBaseService 就行,也比較方面安裝

public class SyncService : IBaseService
{
private readonly System.Timers.Timer _timer;
private readonly ILogger logger;
public SyncService( ILoggerFactory loggerFactory)
{

_timer = new System.Timers.Timer(10000);
_timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

_timer.Interval = 2000;

_timer.AutoReset = true;
_timer.Enabled = false;
logger = loggerFactory.CreateLogger<SyncService>();
}


private void OnTimedEvent(object source, ElapsedEventArgs e)
{
Console.WriteLine(string.Format("SyncService:{0:yyyy-MM-dd HH:mm:sss}", DateTime.Now));
_timer.Enabled = false;

try
{
//do some job;
}
catch (Exception ex)
{
logger.LogError("SyncService Error {0}:", ex.Message);
}
Console.WriteLine(string.Format("SyncService:{0:yyyy-MM-dd HH:mm:sss}", DateTime.Now));

Thread.Sleep(5 * 60 * 1000);

_timer.Enabled = true;

}
private async Task<HttpResponseMessage> SyncData()
{
string url = configModel.DatabaseIncrementUrl;
var httpClient = new HttpClient();
return await httpClient.GetAsync(url);
}


public void Start()
{
_timer.Start();
_timer.Enabled = true;
}
public void Stop()
{
_timer.Stop();
_timer.Enabled = false;
}
}

 

class Program
{
static void Main(string[] args)
{

IConfigurationRoot Configuration;
// ILoggerFactory LoggerFactory;

var builder = new ConfigurationBuilder()
.SetBasePath(Path.Combine(AppContext.BaseDirectory))
.AddJsonFile("appsettings.json")
.AddEnvironmentVariables();

Configuration = builder.Build();

var services = new ServiceCollection();

services.AddOptions();
services.Configure<ConfigModel>(Configuration.GetSection("ConfigSetting"));
services.AddSingleton<IConfiguration>(Configuration);

services.AddTransient<ILoggerFactory, LoggerFactory>();

services.AddTransient<IBaseService, SyncService>();
services.AddTransient<IBaseService, CreateDBService>();
services.AddTransient<IBaseService, OnLineOrderService>();

var serviceProvider = services.BuildServiceProvider();

ServiceRunner<ServiceFactory>.Run(config =>
{
var name = config.GetDefaultName();
config.Service(serviceConfig =>
{
serviceConfig.ServiceFactory((extraArguments, controller) =>
{
return new ServiceFactory(serviceProvider.GetService<IEnumerable<IBaseService>>(), controller);
});
serviceConfig.OnStart((service, extraArguments) =>
{
Console.WriteLine("Service {0} started", name);
service.Start();
});

serviceConfig.OnStop(service =>
{
Console.WriteLine("Service {0} stopped", name);
service.Stop();
});

serviceConfig.OnError(e =>
{
Console.WriteLine("Service {0} errored with exception : {1}", name, e.Message);
});
});

config.SetName("SAASService");
config.SetDescription("SAAS Service For All Saas Client");
config.SetDisplayName("SAAS Service");
});
}
}


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、代碼自動提示 在我們忘記方法名或者想偷懶時,代碼自動提示很管用。不過Eclipse預設是輸入"."後才會出現包或類成員的提示,也就意味著我們必須先輸入一個完整的類名,提示才能出來;或者每次都按下 alt + / 。如何才能讓它每次只要輸入字母之後,也能出現提示呢?在這裡可以設置:Window - ...
  • 多線程程式中,新創建的線程不能訪問UI線程創建的視窗控制項,這時如果想要訪問視窗的控制項,發現無法對其控制。 這時可將視窗構造函數中的CheckForIllegalCrossThreadCalls設置為false;然後就能安全的訪問窗體控制項。 如果捕獲了對錯誤線程的調用,則為 true;否則為 fals ...
  • 現在,因為種種因素,你必須對一個請求或者方法進行頻率上的訪問限制。 比如, 你對外提供了一個API介面,註冊用戶每秒鐘最多可以調用100次,非註冊用戶每秒鐘最多可以調用10次。 比如, 有一個非常吃伺服器資源的方法,在同一時刻不能超過10個人調用這個方法,否則伺服器滿載。 比如, 有一些特殊的頁面, ...
  • 由於對微軟的技術比較感興趣,所以最近就在研究用Visual Studio Code開發一個Asp.net core項目並且準備從後端開始乾起。 一開始用dotnet new console創建了一個控制台項目,在配置文件里發現這是一個.netcoreapp2.0的項目; 之後又用dotnet new ...
  • Nginx是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,併在一個BSD-like 協議下發行。其特點是占有記憶體少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等... ...
  • [翻譯]表達式樹(Expression Trees) 原文地址:https://docs.microsoft.com/en us/dotnet/csharp/programming guide/concepts/expression trees/index 表達式樹展示的是代碼的樹形結構,每一個節點 ...
  • 解決方法如下: 1、在狀態欄中,選擇IISPress站點,右鍵選擇顯示所有應用程式 2、選中你需要修改的站點,點擊最下方配置後面的路徑地址,打開applicationhost.config文件,找到需要修改的站點,添加紅色矩形框內容,並將紅色橢圓框內修改為自己的IP地址。 3、關閉vs 2015,並 ...
  • 首先添加一個.json 文件,比如 setting.json 文件內容如下,記得把文件設置為“複製到輸出目錄” { "ConfigSetting": { "XXXName": "Name", "XXXValue": "Value" }} 下來定義一個接受Model public class Sett ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...