.NET'te Çalışan Hizmetleri

Uzun süre çalışan hizmetler oluşturmanın birçok nedeni vardır, örneğin:

  • YOĞUN CPU kullanımına sahip verileri işleme.
  • Arka planda iş öğelerini kuyruğa alma.
  • Zamanlamayı temel alan bir işlem gerçekleştirme.

Arka plan hizmeti işleme genellikle bir kullanıcı arabirimi (UI) içerir, ancak kullanıcı arabirimleri etrafında yerleşik olarak kullanılabilir. .NET Framework Windows ilk günlerde bu Windows Hizmetleri oluşturabilirdi. Artık .NET ile uygulamasını kullanabilir veya kendi uygulamasını BackgroundServiceIHostedService kullanabilirsiniz.

.NET ile artık tek bir Windows. Platformlar arası arka plan hizmetleri geliştirebilir. Barındırılan hizmetler günlüğe kaydetme, yapılandırma ve bağımlılık ekleme (DI) için hazırdır. Bu kitaplıklar, uzantılar paketinin bir parçası, yani genel ana bilgisayar ile çalışan tüm .NET iş yükleri için temeldir.

Terminoloji

Birçok terim yanlışlıkla eş anlamlı olarak kullanılır. Bu bölümde, amaçlarını daha belirgin hale etmek için bu terimlerden bazılarının tanımları vardır.

  • Arka Plan Hizmeti: Türe BackgroundService başvurur.
  • Barındırılan Hizmet: uygulamasının IHostedService veya kendisine başvuran IHostedService uygulamaları.
  • Uzun Süre Çalışan Hizmet: Sürekli çalışan tüm hizmetler.
  • Windows Hizmeti: Windows hizmeti altyapısı, başlangıçta .NET Framework ancak artık .NET üzerinden erişilebilir.
  • Çalışan Hizmeti: Çalışan Hizmeti şablonunu ifade eder.

Çalışan Hizmeti şablonu

Çalışan Hizmeti şablonu .NET CLI tarafından kullanılabilir ve Visual Studio. Daha fazla bilgi için bkz. .NET CLI, dotnet new worker - şablon. Şablon bir ve Program sınıfından Worker oluşur.

using App.WorkerService;

IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        services.AddHostedService<Worker>();
    })
    .Build();

await host.RunAsync();

Yukarıdaki Program sınıf:

  • Varsayılan 'i IHostBuilder oluşturur.
  • sınıfını ConfigureServices ile Worker barındırılan bir hizmet olarak eklemek için AddHostedService çağrıları.
  • Oluşturucudan IHost bir derlemesi.
  • RunUygulamayı host çalıştıran örneği çağrıları.

Şablondan Program.cs dosyası üst düzey deyimler kullanılarak yeniden yazılabilir:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using App.WorkerService;

using IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices((hostContext, services) =>
    {
        services.AddHostedService<Worker>();
    })
    .Build();

await host.RunAsync();

Bu, özgün şablona işlevsel olarak eşdeğerdir. C# 9 özellikleri hakkında daha fazla bilgi için bkz. C# 9.0'daki yeni özellikler.

için olduğu Worker gibi, şablon basit bir uygulama sağlar.

namespace App.WorkerService
{
    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);
            }
        }
    }
}

Yukarıdaki Worker sınıf, uygulayan bir BackgroundService alt IHostedService sınıfıdır. BackgroundService, bir abstract class 'tir ve uygulamak için alt sınıfı BackgroundService.ExecuteAsync(CancellationToken) gerektirir. Şablon uygulamasında döngüler saniye başına bir kez, işlem iptal edilecek sinyale kadar geçerli ExecuteAsync tarih ve saati günlüğe kaydetme.

Proje dosyası

Çalışan Hizmeti şablonu aşağıdaki proje dosyasını bağlı olarak Sdk oluşturur:

<Project Sdk="Microsoft.NET.Sdk.Worker">

Daha fazla bilgi için bkz. .NET proje SDK'ları.

NuGet paketi

Çalışan Hizmeti şablonunu temel alan bir uygulama SDK'yı kullanır ve Microsoft.NET.Sdk.Worker Microsoft.Extensions.Hosting paketine açık bir paket başvurusuna sahip olur.

Kapsayıcılar ve bulut benimseme

Çoğu modern .NET iş yükü ile kapsayıcılar uygulanabilir bir seçenektir. Visual Studio'de Çalışan Hizmeti şablonundan uzun süre çalışan bir hizmet oluştururken, Docker desteğini kabulabilirsiniz. Bunu yapmak, .NET uygulamalarınızı kapsayıcılı hale gelecek bir Dockerfile oluşturacak. Dockerfile, görüntü oluşturma yönergeleri kümesidir. .NET uygulamaları için Dockerfile genellikle bir çözüm dosyasının yanındaki dizinin kökünde bulunur.

# See https://aka.ms/containerfastmode to understand how Visual Studio uses this
# Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/runtime:5.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["background-service/App.WorkerService.csproj", "background-service/"]
RUN dotnet restore "background-service/App.WorkerService.csproj"
COPY . .
WORKDIR "/src/background-service"
RUN dotnet build "App.WorkerService.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "App.WorkerService.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "App.WorkerService.dll"]

Yukarıdaki Dockerfile adımları şunlardır:

  • temel görüntüsünü diğer mcr.microsoft.com/dotnet/runtime:5.0 adı olarak base ayarlama.
  • Çalışma dizinini /app olarak değiştirme.
  • Görüntüden build diğer adı mcr.microsoft.com/dotnet/sdk:5.0 ayarlama.
  • Çalışma dizini /src olarak değiştirildi.
  • İçeriği kopyalama ve .NET uygulamasını yayımlama:
  • .NET SDK görüntüsünü 'den geçiş mcr.microsoft.com/dotnet/runtime:5.0 (diğer base ad).
  • /publish 'den yayımlanan derleme çıktısını kopyalama.
  • için temsilci seçen giriş noktasını dotnet App.BackgroundService.dll tanımlama.

İpucu

içinde MCR "Microsoft Container Registry" ifadesini ifade ediyor ve Microsoft'un resmi Docker hub'ında yer alan mcr.microsoft.com genel kapsayıcı kataloğu. Microsoft syndicates kapsayıcı kataloğu makalesinde ek ayrıntılar yer alıyor.

Docker'ı .NET Çalışan Hizmetiniz için dağıtım stratejisi olarak hedeflerken, proje dosyasında dikkat edilmesi gereken birkaç nokta vardır:

<Project Sdk="Microsoft.NET.Sdk.Worker">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>true</ImplicitUsings>
    <RootNamespace>App.WorkerService</RootNamespace>
    <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.0" />
    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.11.1" />
  </ItemGroup>
</Project>

Yukarıdaki proje dosyasında <DockerDefaultTargetOS> öğesi, hedefi Linux olarak belirtir. Kapsayıcıları Windows için bunun yerine Windows kullanın. Şablon Microsoft.VisualStudio.Azure.Containers.Tools.Targets NuGet Docker desteği seçildiğinde paket başvurusu olarak otomatik olarak paket paketi eklenir.

.NET ile Docker hakkında daha fazla bilgi için bkz. Öğretici: .NET uygulamasını kapsayıcılı hale uygulama. Azure'a dağıtma hakkında daha fazla bilgi için bkz. Öğretici: Çalışan Hizmetini Azure'a Dağıtma.

Barındırılan Hizmet genişletilebilirliği

arabirimi IHostedService iki yöntem tanımlar:

Bu iki yöntem yaşam döngüsü yöntemleri olarak görev almaktadır. Bunlar sırasıyla konak başlatma ve durdurma olayları sırasında çağrılır.

Not

veya yöntemlerini geçersiz kılınca, hizmetin düzgün bir şekilde başlatıldığından ve/veya kapatıldıktan emin olmak için ve sınıf StartAsync StopAsync yöntemini await base çağırabilirsiniz.

Önemli

Arabirim, genişletme yönteminde genel tür parametre AddHostedService<THostedService>(IServiceCollection) kısıtlaması olarak görev gösterir, yani yalnızca uygulamalara izin verilir. Sağlananları bir alt sınıfla kullanabilir veya tamamen BackgroundService kendi sınıflarınızı kullanabilirsiniz.

Ayrıca bkz.