Kullanarak Windows Hizmeti oluşturma BackgroundService
.NET Framework geliştiricileri büyük olasılıkla Windows Hizmeti uygulamaları hakkında bilgi sahibidir. .NET Core ve .NET 5+'den önce. .NET Framework kullanan geliştiriciler, arka plan görevlerini gerçekleştirmek veya uzun süre çalışan işlemleri yürütmek için Windows Hizmetleri oluşturabilirdi. Bu işlev hala kullanılabilir durumdadır ve Windows Hizmeti olarak çalışan Çalışan Hizmetleri oluşturabilirsiniz.
Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:
- Bir .NET çalışan uygulamasını tek bir dosya yürütülebilir dosyası olarak yayımlayın.
- Bir Windows Hizmeti oluşturun.
BackgroundService
Uygulamayı Windows Hizmeti olarak oluşturun.- Windows Hizmeti'ni başlatın ve durdurun.
- Olay günlüklerini görüntüleyin.
- Windows Hizmeti'ni silin.
Bahşiş
".NET'te Çalışanlar" örnek kaynak kodunun tümü, indirilebilmeniz için Samples Browser'da bulunur. Daha fazla bilgi için bkz . Kod örneklerine göz atma: .NET'te çalışanlar.
Önemli
.NET SDK'sını yüklemek ve çalışan şablonunu da yükler Microsoft.NET.Sdk.Worker
. Başka bir deyişle, .NET SDK'sını yükledikten sonra dotnet new worker komutunu kullanarak yeni bir çalışan oluşturabilirsiniz. Visual Studio kullanıyorsanız, isteğe bağlı ASP.NET ve web geliştirme iş yükü yüklenene kadar şablon gizlenir.
Önkoşullar
- .NET 8.0 SDK veya üzeri
- Windows işletim sistemi
- .NET tümleşik geliştirme ortamı (IDE)
- Visual Studio'yu kullanmaktan çekinmeyin
Yeni proje oluşturma
Visual Studio ile yeni bir Çalışan Hizmeti projesi oluşturmak için Dosya>Yeni>Proje... seçeneğini belirlemeniz gerekir. Yeni proje oluştur iletişim kutusunda "Çalışan Hizmeti" araması yapın ve Çalışan Hizmeti şablonu'na tıklayın. .NET CLI kullanmayı tercih ediyorsanız, sık kullandığınız terminali çalışma dizininde açın. dotnet new
komutunu çalıştırın ve öğesini istediğiniz proje adıyla değiştirin<Project.Name>
.
dotnet new worker --name <Project.Name>
.NET CLI yeni çalışan hizmeti projesi komutu hakkında daha fazla bilgi için bkz . dotnet new worker.
Bahşiş
Visual Studio Code kullanıyorsanız tümleşik terminalden .NET CLI komutlarını çalıştırabilirsiniz. Daha fazla bilgi için bkz . Visual Studio Code: Tümleşik Terminal.
NuGet paketini yükleme
.NET IHostedService uygulamalarından yerel Windows Hizmetleri ile birlikte çalışmanız için NuGet paketini yüklemeniz Microsoft.Extensions.Hosting.WindowsServices
gerekir.
Bunu Visual Studio'dan yüklemek için NuGet Paketlerini Yönet... iletişim kutusunu kullanın. "Microsoft.Extensions.Hosting.WindowsServices" için arama yapın ve yükleyin. .NET CLI kullanmayı tercih ediyorsanız komutunu çalıştırın dotnet add package
:
dotnet add package Microsoft.Extensions.Hosting.WindowsServices
.NET CLI paket ekle komutu hakkında daha fazla bilgi için bkz . dotnet add package.
Paketleri başarıyla ekledikten sonra proje dosyanız artık aşağıdaki paket başvurularını içermelidir:
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" />
</ItemGroup>
Proje dosyasını güncelleştirme
Bu çalışan projesi C# öğesinin null atanabilir başvuru türlerini kullanır. Bunları projenin tamamında etkinleştirmek için proje dosyasını uygun şekilde güncelleştirin:
<Project Sdk="Microsoft.NET.Sdk.Worker">
<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>true</ImplicitUsings>
<RootNamespace>App.WindowsService</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" />
</ItemGroup>
</Project>
Yukarıdaki proje dosyası değişiklikleri düğümü ekler <Nullable>enable<Nullable>
. Daha fazla bilgi için bkz . Null atanabilir bağlamı ayarlama.
Hizmeti oluşturma
Projeye JokeService.cs adlı yeni bir sınıf ekleyin ve içeriğini aşağıdaki C# koduyla değiştirin:
namespace App.WindowsService;
public sealed class JokeService
{
public string GetJoke()
{
Joke joke = _jokes.ElementAt(
Random.Shared.Next(_jokes.Count));
return $"{joke.Setup}{Environment.NewLine}{joke.Punchline}";
}
// Programming jokes borrowed from:
// https://github.com/eklavyadev/karljoke/blob/main/source/jokes.json
private readonly HashSet<Joke> _jokes = new()
{
new Joke("What's the best thing about a Boolean?", "Even if you're wrong, you're only off by a bit."),
new Joke("What's the object-oriented way to become wealthy?", "Inheritance"),
new Joke("Why did the programmer quit their job?", "Because they didn't get arrays."),
new Joke("Why do programmers always mix up Halloween and Christmas?", "Because Oct 31 == Dec 25"),
new Joke("How many programmers does it take to change a lightbulb?", "None that's a hardware problem"),
new Joke("If you put a million monkeys at a million keyboards, one of them will eventually write a Java program", "the rest of them will write Perl"),
new Joke("['hip', 'hip']", "(hip hip array)"),
new Joke("To understand what recursion is...", "You must first understand what recursion is"),
new Joke("There are 10 types of people in this world...", "Those who understand binary and those who don't"),
new Joke("Which song would an exception sing?", "Can't catch me - Avicii"),
new Joke("Why do Java programmers wear glasses?", "Because they don't C#"),
new Joke("How do you check if a webpage is HTML5?", "Try it out on Internet Explorer"),
new Joke("A user interface is like a joke.", "If you have to explain it then it is not that good."),
new Joke("I was gonna tell you a joke about UDP...", "...but you might not get it."),
new Joke("The punchline often arrives before the set-up.", "Do you know the problem with UDP jokes?"),
new Joke("Why do C# and Java developers keep breaking their keyboards?", "Because they use a strongly typed language."),
new Joke("Knock-knock.", "A race condition. Who is there?"),
new Joke("What's the best part about TCP jokes?", "I get to keep telling them until you get them."),
new Joke("A programmer puts two glasses on their bedside table before going to sleep.", "A full one, in case they gets thirsty, and an empty one, in case they don’t."),
new Joke("There are 10 kinds of people in this world.", "Those who understand binary, those who don't, and those who weren't expecting a base 3 joke."),
new Joke("What did the router say to the doctor?", "It hurts when IP."),
new Joke("An IPv6 packet is walking out of the house.", "He goes nowhere."),
new Joke("3 SQL statements walk into a NoSQL bar. Soon, they walk out", "They couldn't find a table.")
};
}
readonly record struct Joke(string Setup, string Punchline);
Yukarıdaki şaka hizmeti kaynak kodu tek bir işlev parçası olan GetJoke
yöntemini kullanıma sunar. Bu, rastgele bir string
programlama şakası temsil eden geri dönen bir yöntemdir. Sınıf kapsamlı _jokes
alanı, şaka listesini depolamak için kullanılır. Listeden rastgele bir şaka seçilir ve döndürülür.
Sınıfı yeniden yazma Worker
Şablondaki var olanı Worker
aşağıdaki C# koduyla değiştirin ve dosyayı WindowsBackgroundService.cs olarak yeniden adlandırın:
namespace App.WindowsService;
public sealed class WindowsBackgroundService(
JokeService jokeService,
ILogger<WindowsBackgroundService> logger) : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
try
{
while (!stoppingToken.IsCancellationRequested)
{
string joke = jokeService.GetJoke();
logger.LogWarning("{Joke}", joke);
await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
}
}
catch (OperationCanceledException)
{
// When the stopping token is canceled, for example, a call made from services.msc,
// we shouldn't exit with a non-zero exit code. In other words, this is expected...
}
catch (Exception ex)
{
logger.LogError(ex, "{Message}", ex.Message);
// Terminates this process and returns an exit code to the operating system.
// This is required to avoid the 'BackgroundServiceExceptionBehavior', which
// performs one of two scenarios:
// 1. When set to "Ignore": will do nothing at all, errors cause zombie services.
// 2. When set to "StopHost": will cleanly stop the host, and log errors.
//
// In order for the Windows Service Management system to leverage configured
// recovery options, we need to terminate the process with a non-zero exit code.
Environment.Exit(1);
}
}
}
Yukarıdaki kodda, JokeService
ile birlikte ILogger
eklenir. Her ikisi de sınıfın kullanımına alan olarak private readonly
sunulur. yönteminde ExecuteAsync
, şaka hizmeti bir şaka isteğinde bulunur ve bunu günlükçüye yazar. Bu durumda, günlükçü Windows Olay Günlüğü - Microsoft.Extensions.Logging.EventLog.EventLogLoggertarafından uygulanır. Günlükler için yazılır ve Olay Görüntüleyicisi görüntülemek için kullanılabilir.
Dekont
Varsayılan olarak, Olay Günlüğü önem derecesi şeklindedir Warning. Bu yapılandırılabilir, ancak tanıtım amacıyla uzantı yöntemiyle LogWarning günlüklerWindowsBackgroundService
. Düzeyi özellikle hedeflemek EventLog
için uygulama ayarlarına bir girdi ekleyin.{ Environment}.json veya bir EventLogSettings.Filter değer sağlayın.
{
"Logging": {
"LogLevel": {
"Default": "Warning"
},
"EventLog": {
"SourceName": "The Joke Service",
"LogName": "Application",
"LogLevel": {
"Microsoft": "Information",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
}
Günlük düzeylerini yapılandırma hakkında daha fazla bilgi için bkz . .NET'te günlüğe kaydetme sağlayıcıları: Windows EventLog'ı yapılandırma.
Sınıfı yeniden yazma Program
Program.cs dosya içeriğini aşağıdaki C# koduyla değiştirin:
using App.WindowsService;
using Microsoft.Extensions.Logging.Configuration;
using Microsoft.Extensions.Logging.EventLog;
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services.AddWindowsService(options =>
{
options.ServiceName = ".NET Joke Service";
});
LoggerProviderOptions.RegisterProviderOptions<
EventLogSettings, EventLogLoggerProvider>(builder.Services);
builder.Services.AddSingleton<JokeService>();
builder.Services.AddHostedService<WindowsBackgroundService>();
IHost host = builder.Build();
host.Run();
AddWindowsService
uzantı yöntemi, uygulamayı Windows Hizmeti olarak çalışacak şekilde yapılandırıyor. Hizmet adı olarak ".NET Joke Service"
ayarlanır. Barındırılan hizmet bağımlılık ekleme için kaydedilir.
Hizmetleri kaydetme hakkında daha fazla bilgi için bkz . .NET'te bağımlılık ekleme.
Uygulamayı yayımlayın
.NET Çalışan Hizmeti uygulamasını bir Windows Hizmeti olarak oluşturmak için, uygulamayı tek bir dosya yürütülebilir dosyası olarak yayımlamanız önerilir. Dosya sisteminde bağımlı dosyalar olmadığından, kendi içinde yürütülebilir dosya olması daha az hataya açıktır. Ancak, Windows Hizmet Denetim Yöneticisi tarafından hedeflenebilen bir *.exe dosyası oluşturduğunuz sürece, tamamen kabul edilebilir olan farklı bir yayımlama kalıcılığı seçebilirsiniz.
Önemli
Alternatif bir yayımlama yaklaşımı *.dll 'yi (*.exe yerine) oluşturmaktır ve Yayımlanan uygulamayı Windows Hizmet Denetim Yöneticisi'ni kullanarak yüklediğinizde .NET CLI'sini temsilci olarak verir ve DLL'yi geçirirsiniz. Daha fazla bilgi için bkz . .NET CLI: dotnet komutu.
sc.exe create ".NET Joke Service" binpath="C:\Path\To\dotnet.exe C:\Path\To\App.WindowsService.dll"
<Project Sdk="Microsoft.NET.Sdk.Worker">
<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>true</ImplicitUsings>
<RootNamespace>App.WindowsService</RootNamespace>
<OutputType>exe</OutputType>
<PublishSingleFile Condition="'$(Configuration)' == 'Release'">true</PublishSingleFile>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" />
</ItemGroup>
</Project>
Proje dosyasının vurgulanan önceki satırları aşağıdaki davranışları tanımlar:
<OutputType>exe</OutputType>
: Bir konsol uygulaması oluşturur.<PublishSingleFile Condition="'$(Configuration)' == 'Release'">true</PublishSingleFile>
: Tek dosyalı yayımlamayı etkinleştirir.<RuntimeIdentifier>win-x64</RuntimeIdentifier>
: RID'siniwin-x64
belirtir.<PlatformTarget>x64</PlatformTarget>
: 64 bitlik hedef platform CPU'sunu belirtin.
Uygulamayı Visual Studio'dan yayımlamak için kalıcı bir yayımlama profili oluşturabilirsiniz. Yayımlama profili XML tabanlıdır ve .pubxml dosya uzantısına sahiptir. Visual Studio, uygulamayı örtük olarak yayımlamak için bu profili kullanır, ancak .NET CLI kullanıyorsanız, kullanılacak yayımlama profilini açıkça belirtmeniz gerekir.
Çözüm Gezgini projeye sağ tıklayın ve Yayımla... öğesini seçin. Ardından, profil oluşturmak için Yayımlama profili ekle'yi seçin. Yayımla iletişim kutusunda Hedef olarak Klasör'e tıklayın.
Varsayılan Konum'u bırakın ve son'u seçin. Profil oluşturulduktan sonra Tüm ayarları göster'i seçin ve Profil ayarlarınızı doğrulayın.
Aşağıdaki ayarların belirtildiğinden emin olun:
- Dağıtım modu: Bağımsız
- Tek dosya üret: işaretli
- ReadyToRun derlemesini etkinleştir: işaretli
- Kullanılmayan derlemeleri kırpma (önizlemede): işaretlenmemiş
Son olarak Yayımla'yı seçin. Uygulama derlenmiş ve sonuçta elde edilen .exe dosyası /publish output dizininde yayımlanır.
Alternatif olarak, uygulamayı yayımlamak için .NET CLI kullanabilirsiniz:
dotnet publish --output "C:\custom\publish\directory"
Daha fazla bilgi için bkz. dotnet publish
.
Önemli
.NET 6 ile, ayarıyla <PublishSingleFile>true</PublishSingleFile>
uygulamada hata ayıklamayı denerseniz, uygulamada hata ayıklayamazsınız. Daha fazla bilgi için bkz . 'PublishSingleFile' .NET 6 uygulamasında hata ayıklarken CoreCLR'ye eklenemiyor.
Windows Hizmeti oluşturma
PowerShell kullanmayı bilmiyorsanız ve hizmetiniz için bir yükleyici oluşturmayı tercih ediyorsanız bkz . Windows Hizmeti yükleyicisi oluşturma. Aksi takdirde, Windows Hizmeti'ni oluşturmak için yerel Windows Hizmet Denetim Yöneticisi'nin (sc.exe) create komutunu kullanın. PowerShell’i Yönetici olarak çalıştırın.
sc.exe create ".NET Joke Service" binpath="C:\Path\To\App.WindowsService.exe"
Bahşiş
Konak yapılandırmasının içerik kökünü değiştirmeniz gerekiyorsa, öğesini belirtirken binpath
bunu komut satırı bağımsız değişkeni olarak geçirebilirsiniz:
sc.exe create "Svc Name" binpath="C:\Path\To\App.exe --contentRoot C:\Other\Path"
Bir çıkış iletisi görürsünüz:
[SC] CreateService SUCCESS
Daha fazla bilgi için bkz . sc.exe create.
Windows Hizmeti'ni yapılandırma
Hizmet oluşturulduktan sonra isteğe bağlı olarak yapılandırabilirsiniz. Hizmet varsayılanlarıyla ilgili sorun yaşıyorsanız Hizmet işlevselliğini doğrulama bölümüne atlayın.
Windows Hizmetleri kurtarma yapılandırma seçenekleri sağlar. Geçerli kurtarma yapılandırma değerlerini okumak için (<Service Name>
burada hizmetlerinizin adıdır) komutunu kullanarak sc.exe qfailure "<Service Name>"
geçerli yapılandırmayı sorgulayabilirsiniz:
sc qfailure ".NET Joke Service"
[SC] QueryServiceConfig2 SUCCESS
SERVICE_NAME: .NET Joke Service
RESET_PERIOD (in seconds) : 0
REBOOT_MESSAGE :
COMMAND_LINE :
Komutu, henüz yapılandırılmadıkları için varsayılan değerler olan kurtarma yapılandırmasını verir.
Kurtarmayı yapılandırmak için hizmetinizin adının nerede <Service Name>
olduğunu kullanınsc.exe failure "<Service Name>"
:
sc.exe failure ".NET Joke Service" reset=0 actions=restart/60000/restart/60000/run/1000
[SC] ChangeServiceConfig2 SUCCESS
Bahşiş
Kurtarma seçeneklerini yapılandırmak için terminal oturumunuzun bir Yönetici istrator olarak çalışması gerekir.
Başarıyla yapılandırıldıktan sonra, komutunu kullanarak sc.exe qfailure "<Service Name>"
değerleri bir kez daha sorgulayabilirsiniz:
sc qfailure ".NET Joke Service"
[SC] QueryServiceConfig2 SUCCESS
SERVICE_NAME: .NET Joke Service
RESET_PERIOD (in seconds) : 0
REBOOT_MESSAGE :
COMMAND_LINE :
FAILURE_ACTIONS : RESTART -- Delay = 60000 milliseconds.
RESTART -- Delay = 60000 milliseconds.
RUN PROCESS -- Delay = 1000 milliseconds.
Yapılandırılan yeniden başlatma değerlerini görürsünüz.
Hizmet kurtarma seçenekleri ve .NET BackgroundService
örnekleri
.NET 6 ile .NET'e yeni barındırma özel durum işleme davranışları eklendi. Sabit BackgroundServiceExceptionBehavior listesi ad alanına eklendi Microsoft.Extensions.Hosting
ve bir özel durum oluştuğunda hizmetin davranışını belirtmek için kullanılır. Aşağıdaki tabloda kullanılabilir seçenekler listelenmiştir:
Seçenek | Açıklama |
---|---|
Ignore | içinde BackgroundService oluşan özel durumları yoksayma. |
StopHost | işlenmeyen IHost bir özel durum oluştuğunda durdurulur. |
.NET 6'nın önceki varsayılan davranışı, zombi işlemlerine (hiçbir şey yapmayan çalışan bir işlem) neden olan şeklindedirIgnore
. .NET 6 ile, varsayılan davranış olur StopHost
ve bu da bir özel durum oluştuğunda konağın durdurulmasıyla sonuçlanır. Ancak temiz bir şekilde durur, yani Windows Hizmeti yönetim sistemi hizmeti yeniden başlatmaz. Hizmetin yeniden başlatılmasına doğru şekilde izin vermek için sıfır olmayan bir çıkış koduyla çağırabilirsiniz Environment.Exit . Aşağıdaki vurgulanmış catch
bloğu göz önünde bulundurun:
namespace App.WindowsService;
public sealed class WindowsBackgroundService(
JokeService jokeService,
ILogger<WindowsBackgroundService> logger) : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
try
{
while (!stoppingToken.IsCancellationRequested)
{
string joke = jokeService.GetJoke();
logger.LogWarning("{Joke}", joke);
await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
}
}
catch (OperationCanceledException)
{
// When the stopping token is canceled, for example, a call made from services.msc,
// we shouldn't exit with a non-zero exit code. In other words, this is expected...
}
catch (Exception ex)
{
logger.LogError(ex, "{Message}", ex.Message);
// Terminates this process and returns an exit code to the operating system.
// This is required to avoid the 'BackgroundServiceExceptionBehavior', which
// performs one of two scenarios:
// 1. When set to "Ignore": will do nothing at all, errors cause zombie services.
// 2. When set to "StopHost": will cleanly stop the host, and log errors.
//
// In order for the Windows Service Management system to leverage configured
// recovery options, we need to terminate the process with a non-zero exit code.
Environment.Exit(1);
}
}
}
Hizmet işlevselliğini doğrulama
Windows Hizmeti olarak oluşturulan uygulamayı görmek için Hizmetler'i açın. Windows tuşunu (veya Ctrl + Esc) seçin ve "Hizmetler"den arama yapın. Hizmetler uygulamasında hizmetinizi adına göre bulabilmelisiniz.
Önemli
Varsayılan olarak, normal (yönetici olmayan) kullanıcılar Windows hizmetlerini yönetemez. Bu uygulamanın beklendiği gibi çalıştığını doğrulamak için bir Yönetici hesabı kullanmanız gerekir.
Hizmetin beklendiği gibi çalıştığını doğrulamak için şunları yapmanız gerekir:
- Hizmeti başlatma
- Günlükleri görüntüleme
- Hizmeti durdurma
Önemli
Uygulamada hata ayıklamak için, Windows Hizmetleri işlemi içinde etkin olarak çalışan yürütülebilir dosyanın hatalarını ayıklamaya çalışmadığınızdan emin olun.
Windows Hizmeti'ni başlatma
Windows Hizmeti'ni başlatmak için komutunu sc.exe start
kullanın:
sc.exe start ".NET Joke Service"
Aşağıdakine benzer bir çıkış görürsünüz:
SERVICE_NAME: .NET Joke Service
TYPE : 10 WIN32_OWN_PROCESS
STATE : 2 START_PENDING
(NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x7d0
PID : 37636
FLAGS
Hizmet Durumu, dışından START_PENDING
Çalışıyor durumuna geçer.
Günlükleri görüntüleme
Günlükleri görüntülemek için Olay Görüntüleyicisi açın. Windows tuşunu (veya Ctrl + Esc) seçin ve için arama yapın."Event Viewer"
Olay Görüntüleyicisi (Yerel)>Windows Günlükleri>Uygulama düğümünü seçin. Uygulamaların ad alanıyla eşleşen bir Kaynak ile uyarı düzeyi girdisi görmeniz gerekir. Girdiye çift tıklayın veya sağ tıklayıp Olay Özellikleri'ni seçerek ayrıntıları görüntüleyin.
Olay Günlüğü'nde günlükleri gördükten sonra hizmeti durdurmanız gerekir. Dakikada bir rastgele bir şaka kaydetmek için tasarlanmıştır. Bu kasıtlı bir davranıştır ancak üretim hizmetleri için pratik değildir .
Windows Hizmetini Durdurma
Windows Hizmeti'ni durdurmak için komutunu sc.exe stop
kullanın:
sc.exe stop ".NET Joke Service"
Aşağıdakine benzer bir çıkış görürsünüz:
SERVICE_NAME: .NET Joke Service
TYPE : 10 WIN32_OWN_PROCESS
STATE : 3 STOP_PENDING
(STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
Hizmet Durumu durumundan STOP_PENDING
Durduruldu durumuna geçer.
Windows Hizmetini Silme
Windows Hizmetini silmek için yerel Windows Hizmet Denetim Yöneticisi'nin (sc.exe) silme komutunu kullanın. PowerShell’i Yönetici olarak çalıştırın.
Önemli
Hizmet Durduruldu durumunda değilse, hemen silinmez. Delete komutunu vermeden önce hizmetin durduruldığından emin olun.
sc.exe delete ".NET Joke Service"
Bir çıkış iletisi görürsünüz:
[SC] DeleteService SUCCESS
Daha fazla bilgi için bkz . sc.exe silme.
Ayrıca bkz.
- Windows Hizmeti yükleyicisi oluşturma
- .NET'te Çalışan Hizmetleri
- Kuyruk Hizmeti Oluşturma
- Bir içindeki kapsamlı hizmetleri kullanma
BackgroundService
- Arabirimi uygulama
IHostedService