.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ı BackgroundService — IHostedService 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
Workerbarı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.0adı olarakbaseayarlama. - Çalışma dizinini /app olarak değiştirme.
- Görüntüden
builddiğer adımcr.microsoft.com/dotnet/sdk:5.0ayarlama. - Çalışma dizini /src olarak değiştirildi.
- İçeriği kopyalama ve .NET uygulamasını yayımlama:
- Uygulama komutu kullanılarak
dotnet publishyayımlanır.
- Uygulama komutu kullanılarak
- .NET SDK görüntüsünü 'den geçiş
mcr.microsoft.com/dotnet/runtime:5.0(diğerbasead). - /publish 'den yayımlanan derleme çıktısını kopyalama.
- için temsilci seçen giriş noktasını
dotnet App.BackgroundService.dlltanı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.