基于.netcore 编写本地服务-新闻详情

基于.netcore 编写本地服务


发布时间:2020-06-01责任编辑:满帅 浏览:1283


服务程序,一般代表一些需要长期稳定运行,没有界面交互的程序,周而复始,生生不息。那么,怎么用.netcore 来编织这么一个程序呢?

利器

以下是在下所使用的工具

· VisualStduio 2019

· .netcore 3.1

起始

道生一使用Woker Service 模板创建服务

启动VisualStudio 2019,选择创建新项目,在上方的搜索栏搜索service ,如下图。

图片.png

或者使用dotnet new worker

这里在下创建一个名为MyService的项目

Bash

1

dotnet new worker -n MyService

窥探一番项目文件,可见里面有两个主要的文件

· Program.cs

Csharp

1
2
3
4
5
6
7
8
9
10
11

public static void Main(string[] args)
{
  CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
          Host.CreateDefaultBuilder(args)
              .ConfigureServices((hostContext, services) =>
              {
                  services.AddHostedService<Worker>();
              });

· Worker.cs

Csharp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

public class Worker : BackgroundService
   {
       private readonly ILogger<Worker> _logger;

       public Worker(ILogger<Worker> logger)
       {
           _logger = logger;
       }

       protected override async Task ExecuteAsync(CancellationToken stoppingToken)
       {
           while (!stoppingToken.IsCancellationRequested)
           {
               _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
               await Task.Delay(1000, stoppingToken);
           }
       }
   }

这两个文件都是相当简洁明了的。
Program.cs 创建Host并对Worker进行托管。
那么Worker是什么?
  Worker.cs中可见Worker只是继承自BackgroundService的子类。
BackgroundService又是何方神圣呢?
窥一眼MyService的项目依赖,依赖包里有Microsoft.Extensions.Hosting这一项,BackgroundService正是来自于此。
这么一看,不过如此,如果阁下不使用VS 模板来创建自己的服务,想必也是易如反掌。

一生二编写属于自己的Worker

新建 MyWorker.cs 文件,内容如下

Csharp

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
32
33
34
35
36
37
38
39
40
41
42

class MyWorker : BackgroundService
   {
       private readonly string[] _lines =
       {
           "沉舟侧畔千帆过,",
           "病树前头万木春。",
           "-------------",
           "长风破浪会有时,",
           "直挂云帆济沧海。",
           "-------------",
           "谁无暴风劲雨时,",
           "守得云开见月明。",
           "-------------"
       };

      

       protected async override Task ExecuteAsync(CancellationToken stoppingToken)
       {
           while(!stoppingToken.IsCancellationRequested)
           {
               

               foreach (var line in _lines)
               {
                   await Task.Delay(1000);

                   foreach (var ch in line)
                   {
                       Console.Write(ch);
                       await Task.Delay(100);
                   }

                  
                   Console.Write(" ");
                  
               }


           }
       }
   }

除此之外,还需要将Worker 注入。
services.AddHostedService<MyWorker>();
注释掉 services.AddHostedService<Worker>();,而只关注MyWorker

运行之后,就可以看到内容输出了。这点很重要,为什么还会有控制台窗口,而不是一个无界面的服务?
2.png

嗯,在程序没有被部署成服务之前,它和控制台程序别无二致。
那么,如和部署成服务呢?

三生万物部署Windows 服务

这里需要使用一把武器 sc
打开cmd窗口(使用Powershell 也可以,但是低版本的Powershell 可能会出错)

Powershell

1
2
3
4
5
6

sc create MyService binpath=E:fullpath oyourbinaryfile.exe

# 另外
sc start MyService
sc stop MyService
sc delete MyService

程序在控制台输出,所以安装成服务并不能看到效果。谁管呢,总而言之,使用.netcore创建服务程序很简单,这种方式用在.netframework上又当如何?此处不再多言。

更多创建服务的方式,可以点击下面的引用链接

Reference

Creating Windows Services In .NET Core – Part 3 – The “.NET Core Worker” Way


外包部供稿