Aracılığıyla paylaş


BackgroundService kullanarak bir Windows Hizmeti oluşturma

.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

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 ILoggereklenir. 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-x64RID'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.

Visual Studio Yayımla iletişim kutusu

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.

Visual Studio Profili ayarları

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.

Windows Hizmeti kurtarma yapılandırma özellikleri iletişim kutusu.

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.

Yeniden başlatmanın etkinleştirildiği Windows Hizmeti kurtarma yapılandırma özellikleri iletişim kutusu.

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.

Hizmetler kullanıcı arabirimi.

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.

Program başlatılamıyor.

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.

Hizmetten günlüğe kaydedilen ayrıntıları içeren Olay Özellikleri iletişim kutusu

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_PENDINGDurduruldu 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.

İleri