.NET рдХреЛрд░ рд╡рд░реНрдХрд░реНрд╕ рд╡рд┐рдВрдбреЛрдЬ рд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ

.NET Core 3.0 рдореЗрдВ, рд╣рдо рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╡рд░реНрдХрд░ рд╕рд░реНрд╡рд┐рд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЖрдкрдХреЛ .NET рдХреЛрд░ рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рд╡реЙрдХрдереНрд░реВ рдореЗрдВ, рд╣рдо рдПрдХ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рд╡рд┐рдВрдбреЛрдЬ рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдПрдВрдЧреЗред




рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░реНрдпрдХрд░реНрддрд╛


рдиреЛрдЯред рд╣рдорд╛рд░реЗ рдкреВрд░реНрд╡-рд░рд┐рд▓реАрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡реЗрдм рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд╕рдорд╛рди рдореЗрдиреВ рдкрд░ рд╣реИред рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рд╡рд░реНрдХрд░ рд╕рд░реНрд╡рд┐рд╕ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рд╕реАрдзреЗ рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд┐рдЬрд╝рд╛рд░реНрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред


Visual Studio рдореЗрдВ рдПрдХ рд╡рд░реНрдХрд░ рдмрдирд╛рдирд╛


рдЫрд╡рд┐


рдЫрд╡рд┐


рдЫрд╡рд┐


рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдПрдХ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдмрдирд╛рдирд╛


dotnet new worker рдЪрд▓рд╛рдПрдБ


рдЫрд╡рд┐


рд╡рд┐рдВрдбреЛрдЬ рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ


рд╡рд┐рдВрдбреЛрдЬ рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ ServiceBase .NET рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ Windows рд╕реЗрд╡рд╛ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЛ .NET рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП:


Microsoft.Extensions.Hosting.WindowsServices NuGet рдкреИрдХреЗрдЬ рдЬреЛрдбрд╝реЗрдВ


рдЫрд╡рд┐


UseServiceBaseLifetime рдХреЙрд▓ рдХреЛ Program.cs рдореЗрдВ HostBuilder рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ


 public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseServiceBaseLifetime() .ConfigureServices(services => { services.AddHostedService<Worker>(); }); } 

рдпрд╣ рд╡рд┐рдзрд┐ рдХреБрдЫ рдЪреАрдЬреЗрдВ рдХрд░рддреА рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬ рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдиреЛрдкреНрд▓реНрд╕ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдпрд╛ рд╡рд┐рдВрдбреЛрдЬ рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рдиреЗ рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рддрд╛ рд╣реИред


рджреВрд╕рд░реЗ, рдпрд╣ ServiceBaseLifetime рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рд╣реЛрд╕реНрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред рдЬрдм рдпрд╣ рдПрдХ Windows рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рддреЛ ServiceBase рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ServiceBase рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдорд╛рдирдХ ConsoleLifetime рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реАрдЯреАрдПрд▓ + рд╕реА рдЬреИрд╕реЗ рд╕рд┐рдЧреНрдирд▓ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред


рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдореЗрдВ ServiceBaseLifetime рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдорд┐рд▓ рдЧрдпрд╛, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд╡рд┐рдВрдбреЛрдЬ рд╕рд░реНрд╡рд┐рд╕ рдХреЛ рдЗрди-рдкреНрд▓реЗрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рд╣рд░ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдкреНрд░рдХрд╛рд╢рди рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдлрд╛рдЗрд▓реЗрдВ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╣реЛрдВ рдФрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдВред


 dotnet publish -oc:\code\workerpub 

рдЕрдЧрд▓рд╛, рдЖрдк рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдореЗрдВ sc рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ


 sc create workertest binPath=c:\code\workerpub\WorkerTest.exe 

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


рдЫрд╡рд┐


рд╕реБрд░рдХреНрд╖рд╛ рдиреЛрдЯ: рдпрд╣ рдХрдорд╛рдВрдб рд╕реЗрд╡рд╛ рдХреЛ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЖрдкрдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ рдПрдХ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕ рдЦрд╛рддреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд╣рдо рдпрд╣рд╛рдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдХреБрдЫ ASP.NET рдкреНрд░рд▓реЗрдЦрди рд╣реИрдВ: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore- 2.2


рд▓реЙрдЧрд┐рдВрдЧ


рд▓реЙрдЧрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рдЗрд╡реЗрдВрдЯ рд▓реЙрдЧ рд╕реЗрд╡рд╛ рд╣реИ, рдЬреЛ рд▓реЙрдЧ рд╕рдВрджреЗрд╢ рдХреЛ рд╕реАрдзреЗ рд╡рд┐рдВрдбреЛрдЬ рдЗрд╡реЗрдВрдЯ рд▓реЙрдЧ рдореЗрдВ рднреЗрдЬ рд╕рдХрддреА рд╣реИред рдИрд╡реЗрдВрдЯ рд▓реЙрдЧ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк Microsoft.Extensions.Logging.EventLog рдкреИрдХреЗрдЬ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдЕрдкрдиреЗ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


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

рдЖрдЧреЗ рдХрд╛ рдХрд╛рдо


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдореЗрдВ, рд╣рдо рд╡рд┐рдВрдбреЛрдЬ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╢реНрд░рдорд┐рдХреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ:


  1. UseWindowsServiceBaseLifetime рдХреЛ UseWindowsService рдХрд╛ рдирд╛рдо рджреЗрдВ
  2. рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдЗрд╡реЗрдВрдЯ рд▓реЙрдЧ рдХреЗ рд╕рд╛рде Windows рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдФрд░ рдмреЗрд╣рддрд░ рдПрдХреАрдХрд░рдг рдЬреЛрдбрд╝реЗрдВред

рдирд┐рд╖реНрдХрд░реНрд╖


рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдк рд╣рдорд╛рд░реЗ рдирдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдЖрдЬрд╝рдорд╛рдПрдВрдЧреЗ рдФрд░ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЖрдк рдпрд╣рд╛рдВ рдХреЛрдИ рднреА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдпрд╛ рд╕реБрдЭрд╛рд╡ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ: https://github.com/aspnet/AspNetCore/issues/new/choose


рдЕрд╡рддрд╛рд░
рдЧреНрд▓реЗрди рдХрдВрдбрд░рди

Source: https://habr.com/ru/post/hi446512/


All Articles