Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
.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 dosyalı yürütülebilir dosya 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.
İpucu
".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 Microsoft.NET.Sdk.Worker
ve çalışan şablonunu da yükler. 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 <Project.Name>
ifadesini istediğiniz proje adıyla değiştirin.
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.
İpucu
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üklemenizMicrosoft.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 aşağıdaki komutu çalıştırın. (.NET 9 veya önceki bir SDK sürümü kullanıyorsanız, bunun yerine formu kullanın dotnet add package
.)
dotnet package add Microsoft.Extensions.Hosting.WindowsServices
Daha fazla bilgi için bkz. dotnet package add.
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="9.0.7" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="9.0.7" />
</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="9.0.7" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="9.0.7" />
</ItemGroup>
</Project>
Önceki proje dosyası değişiklikleri <Nullable>enable<Nullable>
düğümünü ekler. Daha fazla bilgi için Null atanabilir bağlamı ayarlama'ya bkz.
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 programlama şakası string
geri getiren bir yöntemdir. Sınıf kapsamındaki _jokes
alan, şaka listesini depolamak için kullanılır. Listeden rastgele bir şaka seçilir ve döndürülür.
Worker
sınıfını yeniden yaz
Ş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 sunulur. yönteminde ExecuteAsync
, şaka hizmeti bir şaka isteğinde bulunur ve bunu günlükçüye yazar. Bu durumda, kayıt tutucu Windows Olay Günlüğü - Microsoft.Extensions.Logging.EventLog.EventLogLoggerProvider tarafından uygulanır. Günlükler yazılır ve Olay Görüntüleyicisi'nde görüntülenebilir.
Uyarı
Varsayılan olarak, Olay Günlüğü önem derecesi şeklindedir Warning. Bu yapılandırılabilir, ancak tanıtım amacıyla WindowsBackgroundService
uzantı yöntemiyle LogWarning günlükler. Düzeyini özellikle hedeflemek için EventLog
uygulama ayarlarına appsettings.{Environment}.json bir girdi ekleyin 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.
Program
sınıfını yeniden yaz
Şablon 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 enjeksiyonu amacıyla 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 modalitesi seçebilirsiniz.
Önemli
Alternatif bir yayımlama yaklaşımı *.dll ( *.exeyerine) oluşturmaktır ve Yayımlanan uygulamayı Windows Hizmet Denetim Yöneticisi'ni kullanarak yüklediğinizde .NET CLI'ye temsilcilik yapar 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="9.0.7" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="9.0.7" />
</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>
:win-x64
RID'sini 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'nde projeye sağ tıklayın ve Yayımla'yı seçin. Ardından, profil oluşturmak için Yayımlama profili ekle'yi seçin. Yayımla iletişim kutusundan Hedef olarak Klasör seçeneğini seçin.
Varsayılan Konum'u bırakın ve Bitir'i 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 çıktı 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 kullanarak, bu <PublishSingleFile>true</PublishSingleFile>
ayarıyla uygulamada hata ayıklamaya çalışırsanız, hata ayıklama yapamazsınız. Daha fazla bilgi için bkz. 'PublishSingleFile' .NET 6 uygulamasında hata ayıklarken CoreCLR'ye bağlanılamıyor.
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"
İpucu
Host yapılandırmasının içerik kökünü değiştirmeniz gerekiyorsa, bunu komut satırı argümanı olarak belirtebilirsiniz:
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 oluştur.
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.
Kurtarma ayarı için, hizmetinizin adı olan <Service Name>
yerine sc.exe failure "<Service Name>"
kullanın.
sc.exe failure ".NET Joke Service" reset= 0 actions= restart/60000/restart/60000/run/1000
[SC] ChangeServiceConfig2 SUCCESS
İpucu
Kurtarma seçeneklerini yapılandırmak için terminal oturumunuzun Yönetici 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. Enum BackgroundServiceExceptionBehavior ad alanı Microsoft.Extensions.Hosting
içine eklendi ve bir istisna atıldığında hizmetin davranışını belirtmek için kullanılır. Aşağıdaki tabloda kullanılabilir seçenekler listelenmiştir:
Seçenek | Açıklama |
---|---|
Ignore |
BackgroundService içinde oluşan özel durumları yoksay. |
StopHost | İşlenmeyen bir özel durum oluştuğunda, IHost durdurulacaktır. |
.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ış StopHost
’dir ve bu da bir istisna fırlatıldığında konağın durdurulmasıyla sonuçlanır. Ancak düzgün bir şekilde durur, yani Windows Hizmet 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 çıktı 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, START_PENDING
konumundan Çalışıyor durumuna geçecektir.
Günlükleri görüntüleme
Günlükleri görüntülemek için Olay Görüntüleyicisi'ni açın. Windows tuşunu (veya Ctrl + Esc) seçin ve "Event Viewer"
için arama yapın.
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 çıktı 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) delete 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 delete.
Ayrıca bkz.
- Windows Hizmeti yükleyicisi oluşturma
- .NET'te Çalışan Hizmetleri
- Kuyruk Hizmeti Oluşturma
-
Belirli kapsamda hizmetleri kullanmak
BackgroundService
-
IHostedService
arabirimini uygula