中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#怎么用Topshelf創建Windows服務

發布時間:2020-07-23 17:14:59 來源:億速云 閱讀:216 作者:小豬 欄目:編程語言

這篇文章主要為大家展示了C#怎么用Topshelf創建Windows服務,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。

一、項目創建

創建一個控制臺應用程序,項目右鍵->管理 NuGet 程序包->Topshelft及Topshelf.Log4Net。

C#怎么用Topshelf創建Windows服務 

C#怎么用Topshelf創建Windows服務   

二、Topshelf配置

    一般來說,服務都會設置每隔多長時間執行一次任務,這里使用System.Threading.Timer來做個簡單的日志記錄,將日志寫入到Debug\Log文件夾下。

    2.1、Log4Net配置

    新建一個log4net.config的配置文件,在其屬性的復制到輸出目錄項下選擇始終復制。

<&#63;xml version="1.0" encoding="utf-8" &#63;>
<configuration>
 <configSections>
 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
 </configSections>
 <log4net>
 <!-- Console部分log輸出格式的設定 -->
 <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
  <layout type="log4net.Layout.PatternLayout">
  <conversionPattern value="%date [%thread] %-5level %logger - %message %newline" />
  </layout>
 </appender>
 <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="Log\"/>
  <appendToFile value="true"/>
  <maxSizeRollBackups value="10"/>
  <maximumFileSize value="1MB"/>
  <rollingStyle value="Date"/>
  <datePattern value='yyyy-MM-dd".log"' />
  <staticLogFileName value="false"/>
  <!--最小鎖定模型以允許多個進程可以寫入同一個文件-->
  <param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
  <layout type="log4net.Layout.PatternLayout">
  <conversionPattern value="%date %-5level %logger - %message %newline"/>
  </layout>
 </appender>
 <root>
  <level value="ALL" />
  <appender-ref ref="ConsoleAppender" />
  <appender-ref ref="RollingLogFileAppender" />
 </root>
 </log4net>
</configuration>

    2.2、TopshelfService

    新建一個TopshelfService類:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Topshelf;
using Topshelf.Logging;

namespace LinkTo.Test.TopshelfService
{
  public class TopshelfService : ServiceControl
  {
    private static readonly LogWriter logger = HostLogger.Get<TopshelfService>();
    private static Timer timerAsync = null;
    private readonly int dueTimeInterval = 1000 * 5; //單位:毫秒
    private readonly int periodInterval = 1000 * 5; //單位:毫秒

    /// <summary>
    /// 構造函數
    /// </summary>
    public TopshelfService()
    {
      timerAsync = new Timer(AutoAsyncCallback, null, Timeout.Infinite, Timeout.Infinite);
    }

    /// <summary>
    /// 啟動服務
    /// </summary>
    /// <param name="hostControl"></param>
    /// <returns></returns>
    public bool Start(HostControl hostControl)
    {
      try
      {
        logger.Info("HelloTopshelf Start");
        timerAsync.Change(dueTimeInterval, periodInterval);
      }
      catch (Exception ex)
      {
        logger.Info(ex.Message);
      }
      return true;
    }

    /// <summary>
    /// 停止服務
    /// </summary>
    /// <param name="hostControl"></param>
    /// <returns></returns>
    public bool Stop(HostControl hostControl)
    {
      try
      {
        logger.Info("HelloTopshelf Stop");
        if (timerAsync != null)
        {
          timerAsync.Change(Timeout.Infinite, Timeout.Infinite);
          timerAsync.Dispose();
          timerAsync = null;
        }
      }
      catch (Exception ex)
      {
        logger.Info(ex.Message);
      }
      return true;
    }

    /// <summary>
    /// 回調函數
    /// </summary>
    /// <param name="state"></param>
    private void AutoAsyncCallback(object state)
    {
      try
      {
        timerAsync.Change(Timeout.Infinite, Timeout.Infinite);
        logger.Info("AutoAsyncCallback執行開始");
        Thread.Sleep(1000 * 10);
      }
      catch (Exception ex)
      {
        logger.ErrorFormat("AutoAsyncCallback執行異常:{0}", ex.Message);
      }
      finally
      {
        timerAsync.Change(dueTimeInterval, periodInterval);
        logger.Info("AutoAsyncCallback執行結束");
        logger.Info(Environment.NewLine);
      }
    }
  }
}

    2.3、配置和運行宿主服務

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Topshelf;

namespace LinkTo.Test.TopshelfService
{
  class Program
  {
    static void Main(string[] args)
    {
      HostFactory.Run(x =>
      {
        x.UseLog4Net("log4net.config");
        x.RunAsLocalSystem();
        x.Service(settings => new TopshelfService());
        //服務的描述
        x.SetDescription("你好,Topshelf!");
        //服務的顯示名稱
        x.SetDisplayName("Hello Topshelf Service");
        //服務名稱
        x.SetServiceName("HelloTopshelf");
      });
    }
  }
}

    三、安裝與卸載

    3.1、安裝服務

    在Debug文件夾下面,創建一個"安裝服務.bat"的批處理文件:

@echo on

rem 設置DOS窗口的背景顏色及字體顏色
color 2f

rem 設置DOS窗口大小 
mode con: cols=80 lines=25

@echo off
echo 請按任意鍵開始安裝LinkTo.Test.TopshelfService服務

rem 輸出空行
echo.
pause

LinkTo.Test.TopshelfService install
net start HelloTopShelf

pause

    3.2、卸載服務

    在Debug文件夾下面,創建一個"卸載服務.bat"的批處理文件:

@echo on

rem 設置DOS窗口的背景顏色及字體顏色
color 2f

rem 設置DOS窗口大小 
mode con: cols=80 lines=25

@echo off
echo 請按任意鍵開始卸載LinkTo.Test.TopshelfService服務

rem 輸出空行
echo.
pause

net stop HelloTopShelf
LinkTo.Test.TopshelfService uninstall

pause

    3.3、查看服務

    在運行中輸入"services.msc"進入服務,即可看到新建的HelloTopshelf服務:

C#怎么用Topshelf創建Windows服務

    四、添加管理員權限要求

    項目右鍵->添加->新建項->應用程序清單文件。

C#怎么用Topshelf創建Windows服務 

    將requestedExecutionLevel節點的level設置為"requireAdministrator"。

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

以上就是關于C#怎么用Topshelf創建Windows服務的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

营口市| 宜川县| 丰宁| 保亭| 高清| 江孜县| 昌都县| 班玛县| 平果县| 曲阜市| 聂拉木县| 景泰县| 柳州市| 尉氏县| 基隆市| 望城县| 乌鲁木齐市| 巨野县| 永年县| 牡丹江市| 陕西省| 香河县| 克东县| 蓝山县| 洛宁县| 兴化市| 方正县| 互助| 三河市| 彩票| 榆林市| 城口县| 西峡县| 股票| 高台县| 阳西县| 大兴区| 肇庆市| 新平| 阳信县| 富民县|