From 114b8f9e63ea6be3a2aa7ddfae18fc32d169e762 Mon Sep 17 00:00:00 2001 From: David Pine Date: Fri, 15 Dec 2023 07:49:09 -0600 Subject: [PATCH] Upgrade TFMs to .NET 8.0, and packages (#38752) * Upgrade TFMs to .NET 8.0, and packages * Remove worker versioning * Fix ranges, etc. --- docs/core/extensions/cloud-service.md | 6 +- .../extensions/media/profile-settings-6.0.png | Bin 18091 -> 0 bytes .../extensions/media/profile-settings-7.0.png | Bin 18140 -> 0 bytes .../extensions/media/profile-settings.png | Bin 0 -> 22810 bytes docs/core/extensions/queue-service.md | 81 +- docs/core/extensions/scoped-service.md | 60 +- .../distributed/distributed-apis.csproj | 6 +- .../caching/memory-apis/memory-apis.csproj | 6 +- .../caching/memory-worker/CacheWorker.cs | 35 +- .../caching/memory-worker/PhotoService.cs | 21 +- .../memory-worker/memory-worker.csproj | 2 +- .../snippets/channels/LoggingStopwatch.cs | 10 +- .../snippets/channels/channels.csproj | 2 +- .../app-lifetime/app-lifetime.csproj | 2 +- .../console-basic/console-basic.csproj | 2 +- .../ColorConsoleLogger.cs | 18 +- .../console-custom-logging.csproj | 4 +- .../console-di-disposable.csproj | 2 +- .../LoggingMessageWriter.cs | 11 +- .../console-di-ienumerable.csproj | 2 +- .../console-di/ServiceLifetimeReporter.cs | 22 +- .../console-di/console-di.csproj | 2 +- .../console-env/console-env.csproj | 2 +- .../console-host/console-host.csproj | 4 +- .../console-indexer/console-indexer.csproj | 2 +- .../console-ini/console-ini.csproj | 2 +- .../console-json/ExampleService.cs | 7 +- .../console-json/MonitorService.cs | 9 +- .../console-json/ScopedService.cs | 7 +- .../console-json/SettingsOptions.cs | 2 +- .../console-json/ValidateSettingsOptions.cs | 16 +- .../console-json/ValidationService.cs | 2 +- .../console-json/console-json.csproj | 2 +- .../console-memory/console-memory.csproj | 4 +- .../console-raw/console-raw.csproj | 2 +- .../console-xml/console-xml.csproj | 4 +- .../configuration/console/console.csproj | 2 +- .../Providers/EntityConfigurationContext.cs | 7 +- .../Providers/EntityConfigurationProvider.cs | 11 +- .../Providers/EntityConfigurationSource.cs | 10 +- .../custom-provider/custom-provider.csproj | 6 +- .../LoggingMessageWriter.cs | 10 +- .../dependency-injection/Worker.cs | 9 +- .../dependency-injection.csproj | 4 +- .../configuration/di-anti-patterns/Bar.cs | 7 +- .../di-anti-patterns/ExampleDisposable.cs | 11 +- .../configuration/di-anti-patterns/Foo.cs | 10 +- .../configuration/di-anti-patterns/Program.cs | 141 ++-- .../di-anti-patterns/di-anti-patterns.csproj | 4 +- .../options-action/options-action.csproj | 2 +- .../options-configparam.csproj | 2 +- .../options-noparams/options-noparams.csproj | 2 +- .../options-object/options-object.csproj | 2 +- .../options-postconfig.csproj | 4 +- .../options-validation-onstart.csproj | 2 +- .../configuration/worker-scope/Worker.cs | 25 +- .../worker-scope/worker-scope.csproj | 4 +- .../configuration/worker-service/Worker.cs | 9 +- .../worker-service/worker-service.csproj | 2 +- .../fileglobbing/example/example.csproj | 2 +- .../snippets/http/basic/ItemService.cs | 13 +- .../snippets/http/basic/TodoService.cs | 20 +- .../snippets/http/basic/basic.csproj | 2 +- .../http/configurehandler/TodoService.cs | 24 +- .../configurehandler/configurehandler.csproj | 2 +- .../snippets/http/generated/generated.csproj | 2 +- .../snippets/http/http3/http3test.csproj | 2 +- .../snippets/http/named/TodoService.cs | 4 +- .../snippets/http/named/named.csproj | 4 +- .../snippets/http/shared/shared.csproj | 2 +- .../snippets/http/typed/TodoService.cs | 22 +- .../snippets/http/typed/typed.csproj | 2 +- .../localization/example/MessageService.cs | 11 +- .../example/ParameterizedMessageService.cs | 8 +- .../localization/example/example.csproj | 2 +- .../CustomTimePrefixingFormatter.cs | 11 +- ...onsole-formatter-custom-with-config.csproj | 2 +- .../console-formatter-custom.csproj | 4 +- .../console-formatter-json.csproj | 4 +- .../console-formatter-simple.csproj | 4 +- .../console-formatter-systemd.csproj | 2 +- .../logging/di-without-host/Program.cs | 11 +- .../di-without-host/di-without-host.csproj | 8 +- .../getting-started-logger-message.csproj | 6 +- .../getting-started-open-telemetry.csproj | 6 +- .../getting-started-type-category-name.csproj | 6 +- .../getting-started/getting-started.csproj | 6 +- .../library-authors/DiExampleService.cs | 9 +- .../library-authors/library-authors.csproj | 4 +- .../logger-message-generator.csproj | 2 +- .../extensions/snippets/logging/logging.sln | 8 +- .../snippets/logging/minimal-web/Program.cs | 4 + .../worker-service-options/PriorityQueue.cs | 6 +- .../logging/worker-service-options/Worker.cs | 18 +- .../worker-service-options.csproj | 2 +- .../http/ClientSideRateLimitedHandler.cs | 16 +- .../snippets/ratelimit/http/http.csproj | 2 +- .../snippets/workers/{6.0 => }/.dockerignore | 0 .../App.WorkerService.csproj | 15 - .../workers/6.0/background-service/Dockerfile | 21 - .../workers/6.0/background-service/Program.cs | 10 - .../workers/6.0/background-service/Worker.cs | 20 - .../workers/6.0/cloud-service/Program.cs | 8 - .../workers/6.0/queue-service/MonitorLoop.cs | 74 -- .../workers/6.0/queue-service/Program.cs | 25 - .../6.0/queue-service/QueuedHostedService.cs | 52 -- .../DefaultScopedProcessingService.cs | 26 - .../workers/6.0/scoped-service/Program.cs | 11 - .../scoped-service/ScopedBackgroundService.cs | 42 - .../App.SignalCompletionService.csproj | 12 - .../App.SignalCompletionService/Program.cs | 10 - .../App.SignalCompletionService/Worker.cs | 23 - .../App.TimerHostedService.csproj | 13 - .../workers/6.0/timer-service/Program.cs | 10 - .../workers/6.0/timer-service/TimerService.cs | 49 -- .../App.WindowsService.Installer.vdproj | 756 ------------------ .../App.WindowsService.Setup/Package.wxs | 73 -- .../windows-service/App.WindowsService.csproj | 18 - .../workers/6.0/windows-service/Program.cs | 20 - .../WindowsBackgroundService.cs | 45 -- .../workers/6.0/workers (.NET 6.0).sln | 151 ---- .../snippets/workers/7.0/.dockerignore | 25 - .../Properties/launchSettings.json | 14 - .../workers/7.0/background-service/Worker.cs | 20 - .../appsettings.Development.json | 9 - .../7.0/background-service/appsettings.json | 9 - .../workers/7.0/cloud-service/.dockerignore | 25 - .../7.0/cloud-service/App.CloudService.csproj | 13 - .../workers/7.0/cloud-service/Dockerfile | 23 - .../Properties/launchSettings.json | 14 - .../workers/7.0/cloud-service/Worker.cs | 27 - .../appsettings.Development.json | 9 - .../7.0/cloud-service/appsettings.json | 9 - .../7.0/queue-service/App.QueueService.csproj | 13 - .../DefaultBackgroundTaskQueue.cs | 37 - .../7.0/queue-service/IBackgroundTaskQueue.cs | 10 - .../Properties/launchSettings.json | 11 - .../appsettings.Development.json | 9 - .../7.0/queue-service/appsettings.json | 9 - .../scoped-service/App.ScopedService.csproj | 13 - .../IScopedProcessingService.cs | 6 - .../Properties/launchSettings.json | 11 - .../scoped-service/ScopedBackgroundService.cs | 42 - .../appsettings.Development.json | 9 - .../7.0/scoped-service/appsettings.json | 9 - .../Properties/launchSettings.json | 11 - .../App.SignalCompletionService/Worker.cs | 23 - .../appsettings.Development.json | 8 - .../appsettings.json | 8 - .../Properties/launchSettings.json | 11 - .../appsettings.Development.json | 9 - .../7.0/timer-service/appsettings.json | 9 - .../App.WindowsService.Setup.wixproj | 5 - .../7.0/windows-service/JokeService.cs | 43 - .../PublishProfiles/FolderProfile.pubxml | 18 - .../Properties/launchSettings.json | 11 - .../appsettings.Development.json | 15 - .../7.0/windows-service/appsettings.json | 15 - .../workers/7.0/workers (.NET 7.0).sln | 151 ---- .../App.WorkerService.csproj | 2 +- .../{7.0 => }/background-service/Dockerfile | 4 +- .../{7.0 => }/background-service/Program.cs | 0 .../Properties/launchSettings.json | 0 .../workers/background-service/Worker.cs | 13 + .../appsettings.Development.json | 0 .../background-service/appsettings.json | 0 .../{6.0 => }/cloud-service/.dockerignore | 0 .../cloud-service/App.CloudService.csproj | 2 +- .../{6.0 => }/cloud-service/Dockerfile | 4 +- .../{7.0 => }/cloud-service/Program.cs | 0 .../Properties/launchSettings.json | 0 .../workers/{6.0 => }/cloud-service/Worker.cs | 11 +- .../appsettings.Development.json | 0 .../{6.0 => }/cloud-service/appsettings.json | 0 .../queue-service/App.QueueService.csproj | 2 +- .../DefaultBackgroundTaskQueue.cs | 5 +- .../queue-service/IBackgroundTaskQueue.cs | 0 .../{7.0 => }/queue-service/MonitorLoop.cs | 40 +- .../{7.0 => }/queue-service/Program.cs | 0 .../Properties/launchSettings.json | 0 .../queue-service/QueuedHostedService.cs | 28 +- .../appsettings.Development.json | 0 .../{6.0 => }/queue-service/appsettings.json | 0 .../scoped-service/App.ScopedService.csproj | 2 +- .../DefaultScopedProcessingService.cs | 10 +- .../IScopedProcessingService.cs | 0 .../{7.0 => }/scoped-service/Program.cs | 0 .../Properties/launchSettings.json | 0 .../scoped-service/ScopedBackgroundService.cs | 38 + .../appsettings.Development.json | 0 .../{6.0 => }/scoped-service/appsettings.json | 0 .../App.SignalCompletionService.csproj | 2 +- .../App.SignalCompletionService/Program.cs | 0 .../Properties/launchSettings.json | 0 .../App.SignalCompletionService/Worker.cs | 18 + .../appsettings.Development.json | 0 .../appsettings.json | 0 .../App.TimerHostedService.csproj | 2 +- .../{7.0 => }/timer-service/Program.cs | 0 .../Properties/launchSettings.json | 0 .../{7.0 => }/timer-service/TimerService.cs | 11 +- .../appsettings.Development.json | 0 .../{6.0 => }/timer-service/appsettings.json | 0 .../App.WindowsService.Installer.vdproj | 0 .../App.WindowsService.Setup.wixproj | 0 .../App.WindowsService.Setup/Package.wxs | 0 .../windows-service/App.WindowsService.csproj | 2 +- .../{6.0 => }/windows-service/JokeService.cs | 0 .../{7.0 => }/windows-service/Program.cs | 0 .../PublishProfiles/FolderProfile.pubxml | 4 +- .../Properties/launchSettings.json | 0 .../WindowsBackgroundService.cs | 18 +- .../appsettings.Development.json | 0 .../windows-service/appsettings.json | 0 docs/core/extensions/timer-service.md | 38 +- .../windows-service-with-installer.md | 4 +- docs/core/extensions/windows-service.md | 108 +-- docs/core/extensions/workers.md | 76 +- 218 files changed, 481 insertions(+), 3068 deletions(-) delete mode 100644 docs/core/extensions/media/profile-settings-6.0.png delete mode 100644 docs/core/extensions/media/profile-settings-7.0.png create mode 100644 docs/core/extensions/media/profile-settings.png rename docs/core/extensions/snippets/workers/{6.0 => }/.dockerignore (100%) delete mode 100644 docs/core/extensions/snippets/workers/6.0/background-service/App.WorkerService.csproj delete mode 100644 docs/core/extensions/snippets/workers/6.0/background-service/Dockerfile delete mode 100644 docs/core/extensions/snippets/workers/6.0/background-service/Program.cs delete mode 100644 docs/core/extensions/snippets/workers/6.0/background-service/Worker.cs delete mode 100644 docs/core/extensions/snippets/workers/6.0/cloud-service/Program.cs delete mode 100644 docs/core/extensions/snippets/workers/6.0/queue-service/MonitorLoop.cs delete mode 100644 docs/core/extensions/snippets/workers/6.0/queue-service/Program.cs delete mode 100644 docs/core/extensions/snippets/workers/6.0/queue-service/QueuedHostedService.cs delete mode 100644 docs/core/extensions/snippets/workers/6.0/scoped-service/DefaultScopedProcessingService.cs delete mode 100644 docs/core/extensions/snippets/workers/6.0/scoped-service/Program.cs delete mode 100644 docs/core/extensions/snippets/workers/6.0/scoped-service/ScopedBackgroundService.cs delete mode 100644 docs/core/extensions/snippets/workers/6.0/signal-completion-service/App.SignalCompletionService/App.SignalCompletionService.csproj delete mode 100644 docs/core/extensions/snippets/workers/6.0/signal-completion-service/App.SignalCompletionService/Program.cs delete mode 100644 docs/core/extensions/snippets/workers/6.0/signal-completion-service/App.SignalCompletionService/Worker.cs delete mode 100644 docs/core/extensions/snippets/workers/6.0/timer-service/App.TimerHostedService.csproj delete mode 100644 docs/core/extensions/snippets/workers/6.0/timer-service/Program.cs delete mode 100644 docs/core/extensions/snippets/workers/6.0/timer-service/TimerService.cs delete mode 100644 docs/core/extensions/snippets/workers/6.0/windows-service-installer/App.WindowsService.Installer/App.WindowsService.Installer.vdproj delete mode 100644 docs/core/extensions/snippets/workers/6.0/windows-service-setup/App.WindowsService.Setup/Package.wxs delete mode 100644 docs/core/extensions/snippets/workers/6.0/windows-service/App.WindowsService.csproj delete mode 100644 docs/core/extensions/snippets/workers/6.0/windows-service/Program.cs delete mode 100644 docs/core/extensions/snippets/workers/6.0/windows-service/WindowsBackgroundService.cs delete mode 100644 docs/core/extensions/snippets/workers/6.0/workers (.NET 6.0).sln delete mode 100644 docs/core/extensions/snippets/workers/7.0/.dockerignore delete mode 100644 docs/core/extensions/snippets/workers/7.0/background-service/Properties/launchSettings.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/background-service/Worker.cs delete mode 100644 docs/core/extensions/snippets/workers/7.0/background-service/appsettings.Development.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/background-service/appsettings.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/cloud-service/.dockerignore delete mode 100644 docs/core/extensions/snippets/workers/7.0/cloud-service/App.CloudService.csproj delete mode 100644 docs/core/extensions/snippets/workers/7.0/cloud-service/Dockerfile delete mode 100644 docs/core/extensions/snippets/workers/7.0/cloud-service/Properties/launchSettings.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/cloud-service/Worker.cs delete mode 100644 docs/core/extensions/snippets/workers/7.0/cloud-service/appsettings.Development.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/cloud-service/appsettings.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/queue-service/App.QueueService.csproj delete mode 100644 docs/core/extensions/snippets/workers/7.0/queue-service/DefaultBackgroundTaskQueue.cs delete mode 100644 docs/core/extensions/snippets/workers/7.0/queue-service/IBackgroundTaskQueue.cs delete mode 100644 docs/core/extensions/snippets/workers/7.0/queue-service/Properties/launchSettings.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/queue-service/appsettings.Development.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/queue-service/appsettings.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/scoped-service/App.ScopedService.csproj delete mode 100644 docs/core/extensions/snippets/workers/7.0/scoped-service/IScopedProcessingService.cs delete mode 100644 docs/core/extensions/snippets/workers/7.0/scoped-service/Properties/launchSettings.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/scoped-service/ScopedBackgroundService.cs delete mode 100644 docs/core/extensions/snippets/workers/7.0/scoped-service/appsettings.Development.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/scoped-service/appsettings.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/Properties/launchSettings.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/Worker.cs delete mode 100644 docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/appsettings.Development.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/appsettings.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/timer-service/Properties/launchSettings.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/timer-service/appsettings.Development.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/timer-service/appsettings.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/windows-service-setup/App.WindowsService.Setup/App.WindowsService.Setup.wixproj delete mode 100644 docs/core/extensions/snippets/workers/7.0/windows-service/JokeService.cs delete mode 100644 docs/core/extensions/snippets/workers/7.0/windows-service/Properties/PublishProfiles/FolderProfile.pubxml delete mode 100644 docs/core/extensions/snippets/workers/7.0/windows-service/Properties/launchSettings.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/windows-service/appsettings.Development.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/windows-service/appsettings.json delete mode 100644 docs/core/extensions/snippets/workers/7.0/workers (.NET 7.0).sln rename docs/core/extensions/snippets/workers/{7.0 => }/background-service/App.WorkerService.csproj (91%) rename docs/core/extensions/snippets/workers/{7.0 => }/background-service/Dockerfile (86%) rename docs/core/extensions/snippets/workers/{7.0 => }/background-service/Program.cs (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/background-service/Properties/launchSettings.json (100%) create mode 100644 docs/core/extensions/snippets/workers/background-service/Worker.cs rename docs/core/extensions/snippets/workers/{6.0 => }/background-service/appsettings.Development.json (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/background-service/appsettings.json (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/cloud-service/.dockerignore (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/cloud-service/App.CloudService.csproj (91%) rename docs/core/extensions/snippets/workers/{6.0 => }/cloud-service/Dockerfile (87%) rename docs/core/extensions/snippets/workers/{7.0 => }/cloud-service/Program.cs (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/cloud-service/Properties/launchSettings.json (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/cloud-service/Worker.cs (61%) rename docs/core/extensions/snippets/workers/{6.0 => }/cloud-service/appsettings.Development.json (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/cloud-service/appsettings.json (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/queue-service/App.QueueService.csproj (87%) rename docs/core/extensions/snippets/workers/{6.0 => }/queue-service/DefaultBackgroundTaskQueue.cs (89%) rename docs/core/extensions/snippets/workers/{6.0 => }/queue-service/IBackgroundTaskQueue.cs (100%) rename docs/core/extensions/snippets/workers/{7.0 => }/queue-service/MonitorLoop.cs (51%) rename docs/core/extensions/snippets/workers/{7.0 => }/queue-service/Program.cs (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/queue-service/Properties/launchSettings.json (100%) rename docs/core/extensions/snippets/workers/{7.0 => }/queue-service/QueuedHostedService.cs (56%) rename docs/core/extensions/snippets/workers/{6.0 => }/queue-service/appsettings.Development.json (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/queue-service/appsettings.json (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/scoped-service/App.ScopedService.csproj (87%) rename docs/core/extensions/snippets/workers/{7.0 => }/scoped-service/DefaultScopedProcessingService.cs (59%) rename docs/core/extensions/snippets/workers/{6.0 => }/scoped-service/IScopedProcessingService.cs (100%) rename docs/core/extensions/snippets/workers/{7.0 => }/scoped-service/Program.cs (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/scoped-service/Properties/launchSettings.json (100%) create mode 100644 docs/core/extensions/snippets/workers/scoped-service/ScopedBackgroundService.cs rename docs/core/extensions/snippets/workers/{6.0 => }/scoped-service/appsettings.Development.json (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/scoped-service/appsettings.json (100%) rename docs/core/extensions/snippets/workers/{7.0 => }/signal-completion-service/App.SignalCompletionService/App.SignalCompletionService.csproj (85%) rename docs/core/extensions/snippets/workers/{7.0 => }/signal-completion-service/App.SignalCompletionService/Program.cs (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/signal-completion-service/App.SignalCompletionService/Properties/launchSettings.json (100%) create mode 100644 docs/core/extensions/snippets/workers/signal-completion-service/App.SignalCompletionService/Worker.cs rename docs/core/extensions/snippets/workers/{6.0 => }/signal-completion-service/App.SignalCompletionService/appsettings.Development.json (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/signal-completion-service/App.SignalCompletionService/appsettings.json (100%) rename docs/core/extensions/snippets/workers/{7.0 => }/timer-service/App.TimerHostedService.csproj (87%) rename docs/core/extensions/snippets/workers/{7.0 => }/timer-service/Program.cs (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/timer-service/Properties/launchSettings.json (100%) rename docs/core/extensions/snippets/workers/{7.0 => }/timer-service/TimerService.cs (74%) rename docs/core/extensions/snippets/workers/{6.0 => }/timer-service/appsettings.Development.json (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/timer-service/appsettings.json (100%) rename docs/core/extensions/snippets/workers/{7.0 => }/windows-service-installer/App.WindowsService.Installer/App.WindowsService.Installer.vdproj (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/windows-service-setup/App.WindowsService.Setup/App.WindowsService.Setup.wixproj (100%) rename docs/core/extensions/snippets/workers/{7.0 => }/windows-service-setup/App.WindowsService.Setup/Package.wxs (100%) rename docs/core/extensions/snippets/workers/{7.0 => }/windows-service/App.WindowsService.csproj (92%) rename docs/core/extensions/snippets/workers/{6.0 => }/windows-service/JokeService.cs (100%) rename docs/core/extensions/snippets/workers/{7.0 => }/windows-service/Program.cs (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/windows-service/Properties/PublishProfiles/FolderProfile.pubxml (80%) rename docs/core/extensions/snippets/workers/{6.0 => }/windows-service/Properties/launchSettings.json (100%) rename docs/core/extensions/snippets/workers/{7.0 => }/windows-service/WindowsBackgroundService.cs (70%) rename docs/core/extensions/snippets/workers/{6.0 => }/windows-service/appsettings.Development.json (100%) rename docs/core/extensions/snippets/workers/{6.0 => }/windows-service/appsettings.json (100%) diff --git a/docs/core/extensions/cloud-service.md b/docs/core/extensions/cloud-service.md index 75749f3aaf4b4..5dd083c5c64b6 100644 --- a/docs/core/extensions/cloud-service.md +++ b/docs/core/extensions/cloud-service.md @@ -3,7 +3,7 @@ title: Deploy a Worker Service to Azure description: Deploy your .NET Worker Service to Azure with ease, learning from a step-by-step process to optimize your workflow, including Docker and Azure Container Registry. author: IEvangelist ms.author: dapine -ms.date: 08/18/2023 +ms.date: 12/13/2023 ms.topic: tutorial zone_pivot_groups: development-environment-one --- @@ -66,14 +66,14 @@ With the CLI, the *Dockerfile* is **not** created for you. Copy its contents int :::zone-end -:::code language="dockerfile" source="snippets/workers/7.0/cloud-service/Dockerfile"::: +:::code language="dockerfile" source="snippets/workers/cloud-service/Dockerfile"::: :::zone target="docs" pivot="cli" > [!NOTE] > You need to update the various lines in the *Dockerfile* that reference *App.CloudService—replace this with the name of your project. -For more information on the official .NET images, see [Docker Hub: .NET Runtime](https://hub.docker.com/_/microsoft-dotnet-runtime?tab=description) and [Docker Hub: .NET SDK](https://hub.docker.com/_/microsoft-dotnet-sdk?tab=description). +For more information on the official .NET images, see [Docker Hub: .NET Runtime](https://hub.docker.com/_/microsoft-dotnet-runtime) and [Docker Hub: .NET SDK](https://hub.docker.com/_/microsoft-dotnet-sdk). :::zone-end diff --git a/docs/core/extensions/media/profile-settings-6.0.png b/docs/core/extensions/media/profile-settings-6.0.png deleted file mode 100644 index 645c271334fbd823c6c919fc8345abad9a7fb03b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18091 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 B`!)ao diff --git a/docs/core/extensions/media/profile-settings-7.0.png b/docs/core/extensions/media/profile-settings-7.0.png deleted file mode 100644 index 904b5031e2d0c1d1c4f6bbec9998aa1ed642bee6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18140 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 diff --git a/docs/core/extensions/media/profile-settings.png b/docs/core/extensions/media/profile-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..33c88592a9dc14fdef9defae83302250186b411c GIT binary patch literal 22810 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 [!INCLUDE [file-new-worker](includes/file-new-worker.md)] @@ -51,29 +39,11 @@ You may be familiar with the `. Next, add the default implementation to the project. -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code source="snippets/workers/7.0/queue-service/DefaultBackgroundTaskQueue.cs"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code source="snippets/workers/6.0/queue-service/DefaultBackgroundTaskQueue.cs"::: - -:::zone-end +:::code source="snippets/workers/queue-service/DefaultBackgroundTaskQueue.cs"::: The preceding implementation relies on a as a queue. The is called with an explicit capacity. Capacity should be set based on the expected application load and number of concurrent threads accessing the queue. causes calls to to return a task, which completes only when space becomes available. Which leads to backpressure, in case too many publishers/calls start accumulating. @@ -87,16 +57,7 @@ In the following `QueueHostedService` example: Replace the existing `Worker` class with the following C# code, and rename the file to *QueueHostedService.cs*. -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code source="snippets/workers/7.0/queue-service/QueuedHostedService.cs" highlight="29-30,32"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code source="snippets/workers/6.0/queue-service/QueuedHostedService.cs" highlight="29-30,32"::: - -:::zone-end +:::code source="snippets/workers/queue-service/QueuedHostedService.cs" highlight="25-26,28"::: A `MonitorLoop` service handles enqueuing tasks for the hosted service whenever the `w` key is selected on an input device: @@ -106,41 +67,15 @@ A `MonitorLoop` service handles enqueuing tasks for the hosted service whenever - Three 5-second delays are executed . - A `try-catch` statement traps if the task is canceled. -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code source="snippets/workers/7.0/queue-service/MonitorLoop.cs" highlight="5,10,35"::: -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code source="snippets/workers/6.0/queue-service/MonitorLoop.cs" highlight="5,10,35"::: - -:::zone-end +:::code source="snippets/workers/queue-service/MonitorLoop.cs" highlight="4,26"::: Replace the existing `Program` contents with the following C# code: -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code source="snippets/workers/7.0/queue-service/Program.cs" highlight="4-14"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code source="snippets/workers/6.0/queue-service/Program.cs" highlight="3-18"::: - -:::zone-end +:::code source="snippets/workers/queue-service/Program.cs" highlight="4-14"::: The services are registered in (*Program.cs*). The hosted service is registered with the `AddHostedService` extension method. `MonitorLoop` is started in *Program.cs* top-level statement: -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code source="snippets/workers/7.0/queue-service/Program.cs" range="18-19"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code source="snippets/workers/6.0/queue-service/Program.cs" range="22-23"::: - -:::zone-end +:::code source="snippets/workers/queue-service/Program.cs" range="18-19"::: For more information on registering services, see [Dependency injection in .NET](dependency-injection.md). diff --git a/docs/core/extensions/scoped-service.md b/docs/core/extensions/scoped-service.md index 7ecbbf4faa937..7b985180980d1 100644 --- a/docs/core/extensions/scoped-service.md +++ b/docs/core/extensions/scoped-service.md @@ -3,9 +3,8 @@ title: Use scoped services within a BackgroundService description: Learn how to use scoped services within a BackgroundService in .NET. author: IEvangelist ms.author: dapine -ms.date: 03/13/2023 +ms.date: 12/13/2023 ms.topic: tutorial -zone_pivot_groups: dotnet-version --- # Use scoped services within a `BackgroundService` @@ -24,21 +23,10 @@ In this tutorial, you learn how to: ## Prerequisites -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -- The [.NET 7.0 SDK or later](https://dotnet.microsoft.com/download/dotnet/7.0) -- A .NET integrated development environment (IDE) - - Feel free to use [Visual Studio](https://visualstudio.microsoft.com) - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -- The [.NET 6.0 SDK or later](https://dotnet.microsoft.com/download/dotnet/6.0) +- The [.NET 8.0 SDK or later](https://dotnet.microsoft.com/download/dotnet/8.0) - A .NET integrated development environment (IDE) - Feel free to use [Visual Studio](https://visualstudio.microsoft.com) -:::zone-end - [!INCLUDE [file-new-worker](includes/file-new-worker.md)] @@ -46,32 +34,14 @@ In this tutorial, you learn how to: To use [scoped services](dependency-injection.md#scoped) within a `BackgroundService`, create a scope. No scope is created for a hosted service by default. The scoped background service contains the background task's logic. -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code source="snippets/workers/7.0/scoped-service/IScopedProcessingService.cs"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code source="snippets/workers/6.0/scoped-service/IScopedProcessingService.cs"::: - -:::zone-end +:::code source="snippets/workers/scoped-service/IScopedProcessingService.cs"::: The preceding interface defines a single `DoWorkAsync` method. To define the default implementation: - The service is asynchronous. The `DoWorkAsync` method returns a `Task`. For demonstration purposes, a delay of ten seconds is awaited in the `DoWorkAsync` method. - An is injected into the service.: -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code source="snippets/workers/7.0/scoped-service/DefaultScopedProcessingService.cs"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code source="snippets/workers/6.0/scoped-service/DefaultScopedProcessingService.cs"::: - -:::zone-end +:::code source="snippets/workers/scoped-service/DefaultScopedProcessingService.cs"::: The hosted service creates a scope to resolve the scoped background service to call its `DoWorkAsync` method. `DoWorkAsync` returns a `Task`, which is awaited in `ExecuteAsync`: @@ -79,31 +49,13 @@ The hosted service creates a scope to resolve the scoped background service to c Replace the existing `Worker` class with the following C# code, and rename the file to *ScopedBackgroundService.cs*: -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code source="snippets/workers/7.0/scoped-service/ScopedBackgroundService.cs" highlight="26-32"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code source="snippets/workers/6.0/scoped-service/ScopedBackgroundService.cs" highlight="26-32"::: - -:::zone-end +:::code source="snippets/workers/scoped-service/ScopedBackgroundService.cs" highlight="22-28"::: In the preceding code, an explicit scope is created and the `IScopedProcessingService` implementation is resolved from the dependency injection service provider. The resolved service instance is scoped, and its `DoWorkAsync` method is awaited. Replace the template *Program.cs* file contents with the following C# code: -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code source="snippets/workers/7.0/scoped-service/Program.cs" highlight="4-5"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code source="snippets/workers/6.0/scoped-service/Program.cs" highlight="4-8"::: - -:::zone-end +:::code source="snippets/workers/scoped-service/Program.cs" highlight="4-5"::: The services are registered in (*Program.cs*). The hosted service is registered with the `AddHostedService` extension method. diff --git a/docs/core/extensions/snippets/caching/distributed/distributed-apis.csproj b/docs/core/extensions/snippets/caching/distributed/distributed-apis.csproj index ce6c098019c63..e4e531797a69d 100644 --- a/docs/core/extensions/snippets/caching/distributed/distributed-apis.csproj +++ b/docs/core/extensions/snippets/caching/distributed/distributed-apis.csproj @@ -1,7 +1,7 @@ - + - net7.0 + net8.0 enable true CachingExamples.DistributedApis @@ -9,7 +9,7 @@ - + diff --git a/docs/core/extensions/snippets/caching/memory-apis/memory-apis.csproj b/docs/core/extensions/snippets/caching/memory-apis/memory-apis.csproj index e3e9c1c318459..9ef7ea1bf9486 100644 --- a/docs/core/extensions/snippets/caching/memory-apis/memory-apis.csproj +++ b/docs/core/extensions/snippets/caching/memory-apis/memory-apis.csproj @@ -1,7 +1,7 @@ - + - net7.0 + net8.0 enable true CachingExamples.MemoryApis @@ -10,7 +10,7 @@ - + diff --git a/docs/core/extensions/snippets/caching/memory-worker/CacheWorker.cs b/docs/core/extensions/snippets/caching/memory-worker/CacheWorker.cs index 81b2c4b2e4c58..ffbbe7a67dfcd 100644 --- a/docs/core/extensions/snippets/caching/memory-worker/CacheWorker.cs +++ b/docs/core/extensions/snippets/caching/memory-worker/CacheWorker.cs @@ -3,28 +3,21 @@ namespace CachingExamples.Memory; -public sealed class CacheWorker : BackgroundService +public sealed class CacheWorker( + ILogger logger, + HttpClient httpClient, + CacheSignal cacheSignal, + IMemoryCache cache) : BackgroundService { - private readonly ILogger _logger; - private readonly HttpClient _httpClient; - private readonly CacheSignal _cacheSignal; - private readonly IMemoryCache _cache; private readonly TimeSpan _updateInterval = TimeSpan.FromHours(3); private bool _isCacheInitialized = false; private const string Url = "https://jsonplaceholder.typicode.com/photos"; - public CacheWorker( - ILogger logger, - HttpClient httpClient, - CacheSignal cacheSignal, - IMemoryCache cache) => - (_logger, _httpClient, _cacheSignal, _cache) = (logger, httpClient, cacheSignal, cache); - public override async Task StartAsync(CancellationToken cancellationToken) { - await _cacheSignal.WaitAsync(); + await cacheSignal.WaitAsync(); await base.StartAsync(cancellationToken); } @@ -32,23 +25,23 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { - _logger.LogInformation("Updating cache."); + logger.LogInformation("Updating cache."); try { Photo[]? photos = - await _httpClient.GetFromJsonAsync( + await httpClient.GetFromJsonAsync( Url, stoppingToken); if (photos is { Length: > 0 }) { - _cache.Set("Photos", photos); - _logger.LogInformation( + cache.Set("Photos", photos); + logger.LogInformation( "Cache updated with {Count:#,#} photos.", photos.Length); } else { - _logger.LogWarning( + logger.LogWarning( "Unable to fetch photos to update cache."); } } @@ -56,14 +49,14 @@ await _httpClient.GetFromJsonAsync( { if (!_isCacheInitialized) { - _cacheSignal.Release(); + cacheSignal.Release(); _isCacheInitialized = true; } } try { - _logger.LogInformation( + logger.LogInformation( "Will attempt to update the cache in {Hours} hours from now.", _updateInterval.Hours); @@ -71,7 +64,7 @@ await _httpClient.GetFromJsonAsync( } catch (OperationCanceledException) { - _logger.LogWarning("Cancellation acknowledged: shutting down."); + logger.LogWarning("Cancellation acknowledged: shutting down."); break; } } diff --git a/docs/core/extensions/snippets/caching/memory-worker/PhotoService.cs b/docs/core/extensions/snippets/caching/memory-worker/PhotoService.cs index d674f1c65bdf8..a79ac1f0fba5f 100644 --- a/docs/core/extensions/snippets/caching/memory-worker/PhotoService.cs +++ b/docs/core/extensions/snippets/caching/memory-worker/PhotoService.cs @@ -2,29 +2,22 @@ namespace CachingExamples.Memory; -public sealed class PhotoService -{ - private readonly IMemoryCache _cache; - private readonly CacheSignal _cacheSignal; - private readonly ILogger _logger; - - public PhotoService( +public sealed class PhotoService( IMemoryCache cache, CacheSignal cacheSignal, - ILogger logger) => - (_cache, _cacheSignal, _logger) = (cache, cacheSignal, logger); - + ILogger logger) +{ public async IAsyncEnumerable GetPhotosAsync(Func? filter = default) { try { - await _cacheSignal.WaitAsync(); + await cacheSignal.WaitAsync(); Photo[] photos = - (await _cache.GetOrCreateAsync( + (await cache.GetOrCreateAsync( "Photos", _ => { - _logger.LogWarning("This should never happen!"); + logger.LogWarning("This should never happen!"); return Task.FromResult(Array.Empty()); }))!; @@ -42,7 +35,7 @@ public async IAsyncEnumerable GetPhotosAsync(Func? filter = } finally { - _cacheSignal.Release(); + cacheSignal.Release(); } } } diff --git a/docs/core/extensions/snippets/caching/memory-worker/memory-worker.csproj b/docs/core/extensions/snippets/caching/memory-worker/memory-worker.csproj index 0b93b9a860fc7..a41b72fa1444b 100644 --- a/docs/core/extensions/snippets/caching/memory-worker/memory-worker.csproj +++ b/docs/core/extensions/snippets/caching/memory-worker/memory-worker.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable true CachingExamples.Memory diff --git a/docs/core/extensions/snippets/channels/LoggingStopwatch.cs b/docs/core/extensions/snippets/channels/LoggingStopwatch.cs index 4cf165a0e93e3..fd3d8c03d322f 100644 --- a/docs/core/extensions/snippets/channels/LoggingStopwatch.cs +++ b/docs/core/extensions/snippets/channels/LoggingStopwatch.cs @@ -6,19 +6,15 @@ internal static IDisposable WriteDurationToConsole( [CallerMemberName] string? operation = null) => new StopwatchDisposable(operation); - private sealed class StopwatchDisposable : IDisposable + private sealed class StopwatchDisposable(string? operation) : IDisposable { - private readonly string? _operation; - private readonly Stopwatch _stopwatch; - - internal StopwatchDisposable(string? operation) => - (_operation, _stopwatch) = (operation, Stopwatch.StartNew()); + private readonly Stopwatch _stopwatch = Stopwatch.StartNew(); void IDisposable.Dispose() { _stopwatch.Stop(); - Console.WriteLine($"Finished {_operation} in: {_stopwatch.Elapsed}"); + Console.WriteLine($"Finished {operation} in: {_stopwatch.Elapsed}"); } } } diff --git a/docs/core/extensions/snippets/channels/channels.csproj b/docs/core/extensions/snippets/channels/channels.csproj index f02677bf640fc..91b464afeacc1 100644 --- a/docs/core/extensions/snippets/channels/channels.csproj +++ b/docs/core/extensions/snippets/channels/channels.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable enable diff --git a/docs/core/extensions/snippets/configuration/app-lifetime/app-lifetime.csproj b/docs/core/extensions/snippets/configuration/app-lifetime/app-lifetime.csproj index c727a90b48588..42e9c2ac0a4e8 100644 --- a/docs/core/extensions/snippets/configuration/app-lifetime/app-lifetime.csproj +++ b/docs/core/extensions/snippets/configuration/app-lifetime/app-lifetime.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true AppLifetime.Example diff --git a/docs/core/extensions/snippets/configuration/console-basic/console-basic.csproj b/docs/core/extensions/snippets/configuration/console-basic/console-basic.csproj index 82608004b9f03..39ce8323464d7 100644 --- a/docs/core/extensions/snippets/configuration/console-basic/console-basic.csproj +++ b/docs/core/extensions/snippets/configuration/console-basic/console-basic.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true diff --git a/docs/core/extensions/snippets/configuration/console-custom-logging/ColorConsoleLogger.cs b/docs/core/extensions/snippets/configuration/console-custom-logging/ColorConsoleLogger.cs index 5b459dedb4f03..a7884c99d7530 100644 --- a/docs/core/extensions/snippets/configuration/console-custom-logging/ColorConsoleLogger.cs +++ b/docs/core/extensions/snippets/configuration/console-custom-logging/ColorConsoleLogger.cs @@ -1,19 +1,13 @@ using Microsoft.Extensions.Logging; -public sealed class ColorConsoleLogger : ILogger +public sealed class ColorConsoleLogger( + string name, + Func getCurrentConfig) : ILogger { - private readonly string _name; - private readonly Func _getCurrentConfig; - - public ColorConsoleLogger( - string name, - Func getCurrentConfig) => - (_name, _getCurrentConfig) = (name, getCurrentConfig); - public IDisposable? BeginScope(TState state) where TState : notnull => default!; public bool IsEnabled(LogLevel logLevel) => - _getCurrentConfig().LogLevelToColorMap.ContainsKey(logLevel); + getCurrentConfig().LogLevelToColorMap.ContainsKey(logLevel); public void Log( LogLevel logLevel, @@ -27,7 +21,7 @@ public void Log( return; } - ColorConsoleLoggerConfiguration config = _getCurrentConfig(); + ColorConsoleLoggerConfiguration config = getCurrentConfig(); if (config.EventId == 0 || config.EventId == eventId.Id) { ConsoleColor originalColor = Console.ForegroundColor; @@ -36,7 +30,7 @@ public void Log( Console.WriteLine($"[{eventId.Id,2}: {logLevel,-12}]"); Console.ForegroundColor = originalColor; - Console.Write($" {_name} - "); + Console.Write($" {name} - "); Console.ForegroundColor = config.LogLevelToColorMap[logLevel]; Console.Write($"{formatter(state, exception)}"); diff --git a/docs/core/extensions/snippets/configuration/console-custom-logging/console-custom-logging.csproj b/docs/core/extensions/snippets/configuration/console-custom-logging/console-custom-logging.csproj index 016eccbc92cfe..2effbcf10a2ea 100644 --- a/docs/core/extensions/snippets/configuration/console-custom-logging/console-custom-logging.csproj +++ b/docs/core/extensions/snippets/configuration/console-custom-logging/console-custom-logging.csproj @@ -1,8 +1,8 @@ - + Exe - net7.0 + net8.0 enable true ConsoleCustomLogging.Example diff --git a/docs/core/extensions/snippets/configuration/console-di-disposable/console-di-disposable.csproj b/docs/core/extensions/snippets/configuration/console-di-disposable/console-di-disposable.csproj index 417e43418220f..4e0d245ea4544 100644 --- a/docs/core/extensions/snippets/configuration/console-di-disposable/console-di-disposable.csproj +++ b/docs/core/extensions/snippets/configuration/console-di-disposable/console-di-disposable.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true ConsoleDisposable.Example diff --git a/docs/core/extensions/snippets/configuration/console-di-ienumerable/LoggingMessageWriter.cs b/docs/core/extensions/snippets/configuration/console-di-ienumerable/LoggingMessageWriter.cs index e29d51dd83145..16285db26159b 100644 --- a/docs/core/extensions/snippets/configuration/console-di-ienumerable/LoggingMessageWriter.cs +++ b/docs/core/extensions/snippets/configuration/console-di-ienumerable/LoggingMessageWriter.cs @@ -2,13 +2,10 @@ namespace ConsoleDI.IEnumerableExample; -public sealed class LoggingMessageWriter : IMessageWriter +public sealed class LoggingMessageWriter( + ILogger logger) + : IMessageWriter { - private readonly ILogger _logger; - - public LoggingMessageWriter(ILogger logger) => - _logger = logger; - public void Write(string message) => - _logger.LogInformation("Info: {Msg}", message); + logger.LogInformation("Info: {Msg}", message); } diff --git a/docs/core/extensions/snippets/configuration/console-di-ienumerable/console-di-ienumerable.csproj b/docs/core/extensions/snippets/configuration/console-di-ienumerable/console-di-ienumerable.csproj index 8c34f9055c74e..694494c25da35 100644 --- a/docs/core/extensions/snippets/configuration/console-di-ienumerable/console-di-ienumerable.csproj +++ b/docs/core/extensions/snippets/configuration/console-di-ienumerable/console-di-ienumerable.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true ConsoleDI.IEnumerableExample diff --git a/docs/core/extensions/snippets/configuration/console-di/ServiceLifetimeReporter.cs b/docs/core/extensions/snippets/configuration/console-di/ServiceLifetimeReporter.cs index e88791c5d392a..1ce3bc35da43e 100644 --- a/docs/core/extensions/snippets/configuration/console-di/ServiceLifetimeReporter.cs +++ b/docs/core/extensions/snippets/configuration/console-di/ServiceLifetimeReporter.cs @@ -1,25 +1,17 @@ namespace ConsoleDI.Example; -internal sealed class ServiceLifetimeReporter +internal sealed class ServiceLifetimeReporter( + IExampleTransientService transientService, + IExampleScopedService scopedService, + IExampleSingletonService singletonService) { - private readonly IExampleTransientService _transientService; - private readonly IExampleScopedService _scopedService; - private readonly IExampleSingletonService _singletonService; - - public ServiceLifetimeReporter( - IExampleTransientService transientService, - IExampleScopedService scopedService, - IExampleSingletonService singletonService) => - (_transientService, _scopedService, _singletonService) = - (transientService, scopedService, singletonService); - public void ReportServiceLifetimeDetails(string lifetimeDetails) { Console.WriteLine(lifetimeDetails); - LogService(_transientService, "Always different"); - LogService(_scopedService, "Changes only with lifetime"); - LogService(_singletonService, "Always the same"); + LogService(transientService, "Always different"); + LogService(scopedService, "Changes only with lifetime"); + LogService(singletonService, "Always the same"); } private static void LogService(T service, string message) diff --git a/docs/core/extensions/snippets/configuration/console-di/console-di.csproj b/docs/core/extensions/snippets/configuration/console-di/console-di.csproj index dc268ee664bd0..491dc7bf208c4 100644 --- a/docs/core/extensions/snippets/configuration/console-di/console-di.csproj +++ b/docs/core/extensions/snippets/configuration/console-di/console-di.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true ConsoleDI.Example diff --git a/docs/core/extensions/snippets/configuration/console-env/console-env.csproj b/docs/core/extensions/snippets/configuration/console-env/console-env.csproj index 14acd11f55541..0ec13ae5e0026 100644 --- a/docs/core/extensions/snippets/configuration/console-env/console-env.csproj +++ b/docs/core/extensions/snippets/configuration/console-env/console-env.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true ConsoleEnvironment.Example diff --git a/docs/core/extensions/snippets/configuration/console-host/console-host.csproj b/docs/core/extensions/snippets/configuration/console-host/console-host.csproj index 2a5372b8057a8..660e8250d9ce1 100644 --- a/docs/core/extensions/snippets/configuration/console-host/console-host.csproj +++ b/docs/core/extensions/snippets/configuration/console-host/console-host.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true ConsoleHost.Example @@ -19,7 +19,7 @@ - + diff --git a/docs/core/extensions/snippets/configuration/console-indexer/console-indexer.csproj b/docs/core/extensions/snippets/configuration/console-indexer/console-indexer.csproj index 82608004b9f03..39ce8323464d7 100644 --- a/docs/core/extensions/snippets/configuration/console-indexer/console-indexer.csproj +++ b/docs/core/extensions/snippets/configuration/console-indexer/console-indexer.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true diff --git a/docs/core/extensions/snippets/configuration/console-ini/console-ini.csproj b/docs/core/extensions/snippets/configuration/console-ini/console-ini.csproj index 8c477da506fc2..63dcbb40647eb 100644 --- a/docs/core/extensions/snippets/configuration/console-ini/console-ini.csproj +++ b/docs/core/extensions/snippets/configuration/console-ini/console-ini.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true ConsoleIni.Example diff --git a/docs/core/extensions/snippets/configuration/console-json/ExampleService.cs b/docs/core/extensions/snippets/configuration/console-json/ExampleService.cs index 0f0a229730284..8d84c534f8685 100644 --- a/docs/core/extensions/snippets/configuration/console-json/ExampleService.cs +++ b/docs/core/extensions/snippets/configuration/console-json/ExampleService.cs @@ -2,12 +2,9 @@ namespace ConsoleJson.Example; -public sealed class ExampleService +public sealed class ExampleService(IOptions options) { - private readonly TransientFaultHandlingOptions _options; - - public ExampleService(IOptions options) => - _options = options.Value; + private readonly TransientFaultHandlingOptions _options = options.Value; public void DisplayValues() { diff --git a/docs/core/extensions/snippets/configuration/console-json/MonitorService.cs b/docs/core/extensions/snippets/configuration/console-json/MonitorService.cs index ee6e32e6d5843..aa0cfe215637d 100644 --- a/docs/core/extensions/snippets/configuration/console-json/MonitorService.cs +++ b/docs/core/extensions/snippets/configuration/console-json/MonitorService.cs @@ -2,16 +2,11 @@ namespace ConsoleJson.Example; -public sealed class MonitorService +public sealed class MonitorService(IOptionsMonitor monitor) { - private readonly IOptionsMonitor _monitor; - - public MonitorService(IOptionsMonitor monitor) => - _monitor = monitor; - public void DisplayValues() { - TransientFaultHandlingOptions options = _monitor.CurrentValue; + TransientFaultHandlingOptions options = monitor.CurrentValue; Console.WriteLine($"TransientFaultHandlingOptions.Enabled={options.Enabled}"); Console.WriteLine($"TransientFaultHandlingOptions.AutoRetryDelay={options.AutoRetryDelay}"); diff --git a/docs/core/extensions/snippets/configuration/console-json/ScopedService.cs b/docs/core/extensions/snippets/configuration/console-json/ScopedService.cs index 6a902c4ab36b4..5c1b4aae3b674 100644 --- a/docs/core/extensions/snippets/configuration/console-json/ScopedService.cs +++ b/docs/core/extensions/snippets/configuration/console-json/ScopedService.cs @@ -2,12 +2,9 @@ namespace ConsoleJson.Example; -public sealed class ScopedService +public sealed class ScopedService(IOptionsSnapshot options) { - private readonly TransientFaultHandlingOptions _options; - - public ScopedService(IOptionsSnapshot options) => - _options = options.Value; + private readonly TransientFaultHandlingOptions _options = options.Value; public void DisplayValues() { diff --git a/docs/core/extensions/snippets/configuration/console-json/SettingsOptions.cs b/docs/core/extensions/snippets/configuration/console-json/SettingsOptions.cs index c709594489291..6f9ff9b16a6d2 100644 --- a/docs/core/extensions/snippets/configuration/console-json/SettingsOptions.cs +++ b/docs/core/extensions/snippets/configuration/console-json/SettingsOptions.cs @@ -9,7 +9,7 @@ public sealed class SettingsOptions [RegularExpression(@"^[a-zA-Z''-'\s]{1,40}$")] public required string SiteTitle { get; set; } = null!; - [Range(0, 1000, + [Range(0, 1_000, ErrorMessage = "Value for {0} must be between {1} and {2}.")] public required int Scale { get; set; } diff --git a/docs/core/extensions/snippets/configuration/console-json/ValidateSettingsOptions.cs b/docs/core/extensions/snippets/configuration/console-json/ValidateSettingsOptions.cs index 18eae90191659..c8c0ba9bfabca 100644 --- a/docs/core/extensions/snippets/configuration/console-json/ValidateSettingsOptions.cs +++ b/docs/core/extensions/snippets/configuration/console-json/ValidateSettingsOptions.cs @@ -5,13 +5,13 @@ namespace ConsoleJson.Example; -sealed partial class ValidateSettingsOptions : IValidateOptions +sealed partial class ValidateSettingsOptions( + IConfiguration config) + : IValidateOptions { - public SettingsOptions? _settings { get; private set; } - - public ValidateSettingsOptions(IConfiguration config) => - _settings = config.GetSection(SettingsOptions.ConfigurationSectionName) - .Get(); + public SettingsOptions? Settings { get; private set; } = + config.GetSection(SettingsOptions.ConfigurationSectionName) + .Get(); public ValidateOptionsResult Validate(string? name, SettingsOptions options) { @@ -27,12 +27,12 @@ public ValidateOptionsResult Validate(string? name, SettingsOptions options) (failure ??= new()).AppendLine($"{options.Scale} isn't within Range 0 - 1000"); } - if (_settings is { Scale: 0 } && _settings.VerbosityLevel <= _settings.Scale) + if (Settings is { Scale: 0 } && Settings.VerbosityLevel <= Settings.Scale) { (failure ??= new()).AppendLine("VerbosityLevel must be > than Scale."); } - return failure is not null ? + return failure is not null ? ValidateOptionsResult.Fail(failure.ToString()) : ValidateOptionsResult.Success; } diff --git a/docs/core/extensions/snippets/configuration/console-json/ValidationService.cs b/docs/core/extensions/snippets/configuration/console-json/ValidationService.cs index 6479916140089..d9b50f5ed0346 100644 --- a/docs/core/extensions/snippets/configuration/console-json/ValidationService.cs +++ b/docs/core/extensions/snippets/configuration/console-json/ValidationService.cs @@ -23,7 +23,7 @@ public ValidationService( { foreach (string failure in ex.Failures) { - _logger.LogError(failure); + _logger.LogError("Validation error: {FailureMessage}", failure); } } } diff --git a/docs/core/extensions/snippets/configuration/console-json/console-json.csproj b/docs/core/extensions/snippets/configuration/console-json/console-json.csproj index fbba518bfb6e7..df0d2af529f6e 100644 --- a/docs/core/extensions/snippets/configuration/console-json/console-json.csproj +++ b/docs/core/extensions/snippets/configuration/console-json/console-json.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true ConsoleJson.Example diff --git a/docs/core/extensions/snippets/configuration/console-memory/console-memory.csproj b/docs/core/extensions/snippets/configuration/console-memory/console-memory.csproj index dcd7e1595db6c..a3156ff3e317e 100644 --- a/docs/core/extensions/snippets/configuration/console-memory/console-memory.csproj +++ b/docs/core/extensions/snippets/configuration/console-memory/console-memory.csproj @@ -1,8 +1,8 @@ - + Exe - net7.0 + net8.0 enable true ConsoleMemory.Example diff --git a/docs/core/extensions/snippets/configuration/console-raw/console-raw.csproj b/docs/core/extensions/snippets/configuration/console-raw/console-raw.csproj index 89e7d297207f1..b98efdfdf2c00 100644 --- a/docs/core/extensions/snippets/configuration/console-raw/console-raw.csproj +++ b/docs/core/extensions/snippets/configuration/console-raw/console-raw.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true diff --git a/docs/core/extensions/snippets/configuration/console-xml/console-xml.csproj b/docs/core/extensions/snippets/configuration/console-xml/console-xml.csproj index 8eb6b1043ad2f..6ef43c1b58f4e 100644 --- a/docs/core/extensions/snippets/configuration/console-xml/console-xml.csproj +++ b/docs/core/extensions/snippets/configuration/console-xml/console-xml.csproj @@ -1,8 +1,8 @@ - + Exe - net7.0 + net8.0 enable true ConsoleXml.Example diff --git a/docs/core/extensions/snippets/configuration/console/console.csproj b/docs/core/extensions/snippets/configuration/console/console.csproj index 8bd2fb47b7e88..2c44cda82abc2 100644 --- a/docs/core/extensions/snippets/configuration/console/console.csproj +++ b/docs/core/extensions/snippets/configuration/console/console.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true Console.Example diff --git a/docs/core/extensions/snippets/configuration/custom-provider/Providers/EntityConfigurationContext.cs b/docs/core/extensions/snippets/configuration/custom-provider/Providers/EntityConfigurationContext.cs index 30f10c12410a4..8a1ec13d9c0b9 100644 --- a/docs/core/extensions/snippets/configuration/custom-provider/Providers/EntityConfigurationContext.cs +++ b/docs/core/extensions/snippets/configuration/custom-provider/Providers/EntityConfigurationContext.cs @@ -3,15 +3,12 @@ namespace CustomProvider.Example.Providers; -public class EntityConfigurationContext : DbContext +public class EntityConfigurationContext(string? connectionString) : DbContext { - private readonly string _connectionString; + private readonly string _connectionString = connectionString ?? ""; public DbSet Settings => Set(); - public EntityConfigurationContext(string? connectionString) => - _connectionString = connectionString ?? ""; - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { _ = _connectionString switch diff --git a/docs/core/extensions/snippets/configuration/custom-provider/Providers/EntityConfigurationProvider.cs b/docs/core/extensions/snippets/configuration/custom-provider/Providers/EntityConfigurationProvider.cs index 6cd8474f3d4a9..ca4030199336c 100644 --- a/docs/core/extensions/snippets/configuration/custom-provider/Providers/EntityConfigurationProvider.cs +++ b/docs/core/extensions/snippets/configuration/custom-provider/Providers/EntityConfigurationProvider.cs @@ -3,16 +3,13 @@ namespace CustomProvider.Example.Providers; -public class EntityConfigurationProvider : ConfigurationProvider +public class EntityConfigurationProvider( + string? connectionString) + : ConfigurationProvider { - private readonly string? _connectionString; - - public EntityConfigurationProvider(string? connectionString) => - _connectionString = connectionString; - public override void Load() { - using var dbContext = new EntityConfigurationContext(_connectionString); + using var dbContext = new EntityConfigurationContext(connectionString); dbContext.Database.EnsureCreated(); diff --git a/docs/core/extensions/snippets/configuration/custom-provider/Providers/EntityConfigurationSource.cs b/docs/core/extensions/snippets/configuration/custom-provider/Providers/EntityConfigurationSource.cs index 3ef05c9f5951b..4d12e1fab7d8e 100644 --- a/docs/core/extensions/snippets/configuration/custom-provider/Providers/EntityConfigurationSource.cs +++ b/docs/core/extensions/snippets/configuration/custom-provider/Providers/EntityConfigurationSource.cs @@ -2,13 +2,9 @@ namespace CustomProvider.Example.Providers; -public class EntityConfigurationSource : IConfigurationSource +public class EntityConfigurationSource( + string? connectionString) : IConfigurationSource { - private readonly string? _connectionString; - - public EntityConfigurationSource(string? connectionString) => - _connectionString = connectionString; - public IConfigurationProvider Build(IConfigurationBuilder builder) => - new EntityConfigurationProvider(_connectionString); + new EntityConfigurationProvider(connectionString); } diff --git a/docs/core/extensions/snippets/configuration/custom-provider/custom-provider.csproj b/docs/core/extensions/snippets/configuration/custom-provider/custom-provider.csproj index 6bc00b4afbbfa..7ed43933e4b62 100644 --- a/docs/core/extensions/snippets/configuration/custom-provider/custom-provider.csproj +++ b/docs/core/extensions/snippets/configuration/custom-provider/custom-provider.csproj @@ -1,8 +1,8 @@ - + Exe - net7.0 + net8.0 enable true CustomProvider.Example @@ -10,7 +10,7 @@ - + diff --git a/docs/core/extensions/snippets/configuration/dependency-injection/LoggingMessageWriter.cs b/docs/core/extensions/snippets/configuration/dependency-injection/LoggingMessageWriter.cs index 2330a2baf5a38..c77548b6cc000 100644 --- a/docs/core/extensions/snippets/configuration/dependency-injection/LoggingMessageWriter.cs +++ b/docs/core/extensions/snippets/configuration/dependency-injection/LoggingMessageWriter.cs @@ -1,12 +1,8 @@ namespace DependencyInjection.Example; -public class LoggingMessageWriter : IMessageWriter +public class LoggingMessageWriter( + ILogger logger) : IMessageWriter { - private readonly ILogger _logger; - - public LoggingMessageWriter(ILogger logger) => - _logger = logger; - public void Write(string message) => - _logger.LogInformation("Info: {Msg}", message); + logger.LogInformation("Info: {Msg}", message); } diff --git a/docs/core/extensions/snippets/configuration/dependency-injection/Worker.cs b/docs/core/extensions/snippets/configuration/dependency-injection/Worker.cs index bb29916bacba3..c40efdf98efae 100644 --- a/docs/core/extensions/snippets/configuration/dependency-injection/Worker.cs +++ b/docs/core/extensions/snippets/configuration/dependency-injection/Worker.cs @@ -1,17 +1,12 @@ namespace DependencyInjection.Example; -public sealed class Worker : BackgroundService +public sealed class Worker(IMessageWriter messageWriter) : BackgroundService { - private readonly IMessageWriter _messageWriter; - - public Worker(IMessageWriter messageWriter) => - _messageWriter = messageWriter; - protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { - _messageWriter.Write($"Worker running at: {DateTimeOffset.Now}"); + messageWriter.Write($"Worker running at: {DateTimeOffset.Now}"); await Task.Delay(1_000, stoppingToken); } } diff --git a/docs/core/extensions/snippets/configuration/dependency-injection/dependency-injection.csproj b/docs/core/extensions/snippets/configuration/dependency-injection/dependency-injection.csproj index 18905e1478429..a9fb72c4e37c5 100644 --- a/docs/core/extensions/snippets/configuration/dependency-injection/dependency-injection.csproj +++ b/docs/core/extensions/snippets/configuration/dependency-injection/dependency-injection.csproj @@ -1,7 +1,7 @@ - + - net7.0 + net8.0 enable true DependencyInjection.Example diff --git a/docs/core/extensions/snippets/configuration/di-anti-patterns/Bar.cs b/docs/core/extensions/snippets/configuration/di-anti-patterns/Bar.cs index 6179e7540b3dc..3c145fc45d81e 100644 --- a/docs/core/extensions/snippets/configuration/di-anti-patterns/Bar.cs +++ b/docs/core/extensions/snippets/configuration/di-anti-patterns/Bar.cs @@ -1,6 +1,5 @@ -namespace DependencyInjection.AntiPatterns +namespace DependencyInjection.AntiPatterns; + +public class Bar { - public class Bar - { - } } diff --git a/docs/core/extensions/snippets/configuration/di-anti-patterns/ExampleDisposable.cs b/docs/core/extensions/snippets/configuration/di-anti-patterns/ExampleDisposable.cs index 81fede61b456d..116aed3e2452b 100644 --- a/docs/core/extensions/snippets/configuration/di-anti-patterns/ExampleDisposable.cs +++ b/docs/core/extensions/snippets/configuration/di-anti-patterns/ExampleDisposable.cs @@ -1,8 +1,7 @@ -namespace DependencyInjection.AntiPatterns +namespace DependencyInjection.AntiPatterns; + +public class ExampleDisposable : IDisposable { - public class ExampleDisposable : IDisposable - { - public void Dispose() => - Console.WriteLine($"Disposed: {GetHashCode(),12}"); - } + public void Dispose() => + Console.WriteLine($"Disposed: {GetHashCode(),12}"); } diff --git a/docs/core/extensions/snippets/configuration/di-anti-patterns/Foo.cs b/docs/core/extensions/snippets/configuration/di-anti-patterns/Foo.cs index db18f6bf1ca28..45f023cca0596 100644 --- a/docs/core/extensions/snippets/configuration/di-anti-patterns/Foo.cs +++ b/docs/core/extensions/snippets/configuration/di-anti-patterns/Foo.cs @@ -1,9 +1,5 @@ -namespace DependencyInjection.AntiPatterns +namespace DependencyInjection.AntiPatterns; + +public class Foo(Bar bar) { - public class Foo - { - public Foo(Bar bar) - { - } - } } diff --git a/docs/core/extensions/snippets/configuration/di-anti-patterns/Program.cs b/docs/core/extensions/snippets/configuration/di-anti-patterns/Program.cs index 454c0e8d03a86..933386b3c26f4 100644 --- a/docs/core/extensions/snippets/configuration/di-anti-patterns/Program.cs +++ b/docs/core/extensions/snippets/configuration/di-anti-patterns/Program.cs @@ -1,90 +1,83 @@ -namespace DependencyInjection.AntiPatterns -{ - class Program - { - static void Main() - { - // Uncomment individual methods below to see anti-patterns in action: - // TransientDisposablesWithoutDispose(); - // DeadLockWithFactories(); - // CaptiveDependency(); - // ScopedServiceBecomesSingleton(); - } +using DependencyInjection.AntiPatterns; - // - static void TransientDisposablesWithoutDispose() - { - var services = new ServiceCollection(); - services.AddTransient(); - ServiceProvider serviceProvider = services.BuildServiceProvider(); +// Uncomment individual methods below to see anti-patterns in action: +// TransientDisposablesWithoutDispose(); +// DeadLockWithFactories(); +// CaptiveDependency(); +// ScopedServiceBecomesSingleton(); - for (int i = 0; i < 1000; ++ i) - { - _ = serviceProvider.GetRequiredService(); - } +// +static void TransientDisposablesWithoutDispose() +{ + var services = new ServiceCollection(); + services.AddTransient(); + ServiceProvider serviceProvider = services.BuildServiceProvider(); - // serviceProvider.Dispose(); - } - // + for (int i = 0; i < 1000; ++i) + { + _ = serviceProvider.GetRequiredService(); + } - // - static void DeadLockWithAsyncFactory() - { - var services = new ServiceCollection(); - services.AddSingleton(implementationFactory: provider => - { - Bar bar = GetBarAsync(provider).Result; - return new Foo(bar); - }); + // serviceProvider.Dispose(); +} +// - services.AddSingleton(); +// +static void DeadLockWithAsyncFactory() +{ + var services = new ServiceCollection(); + services.AddSingleton(implementationFactory: provider => + { + Bar bar = GetBarAsync(provider).Result; + return new Foo(bar); + }); - using ServiceProvider serviceProvider = services.BuildServiceProvider(); - _ = serviceProvider.GetRequiredService(); - } - // + services.AddSingleton(); - // - static async Task GetBarAsync(IServiceProvider serviceProvider) - { - // Emulate asynchronous work operation - await Task.Delay(1000); + using ServiceProvider serviceProvider = services.BuildServiceProvider(); + _ = serviceProvider.GetRequiredService(); +} +// - return serviceProvider.GetRequiredService(); - } - // +// +static async Task GetBarAsync(IServiceProvider serviceProvider) +{ + // Emulate asynchronous work operation + await Task.Delay(1000); - // - static void CaptiveDependency() - { - var services = new ServiceCollection(); - services.AddSingleton(); - services.AddScoped(); + return serviceProvider.GetRequiredService(); +} +// - using ServiceProvider serviceProvider = services.BuildServiceProvider(); - // Enable scope validation - // using ServiceProvider serviceProvider = services.BuildServiceProvider(validateScopes: true); +// +static void CaptiveDependency() +{ + var services = new ServiceCollection(); + services.AddSingleton(); + services.AddScoped(); - _ = serviceProvider.GetRequiredService(); - } - // + using ServiceProvider serviceProvider = services.BuildServiceProvider(); + // Enable scope validation + // using ServiceProvider serviceProvider = services.BuildServiceProvider(validateScopes: true); - // - static void ScopedServiceBecomesSingleton() - { - var services = new ServiceCollection(); - services.AddScoped(); + _ = serviceProvider.GetRequiredService(); +} +// - using ServiceProvider serviceProvider = services.BuildServiceProvider(validateScopes: true); - using (IServiceScope scope = serviceProvider.CreateScope()) - { - // Correctly scoped resolution - Bar correct = scope.ServiceProvider.GetRequiredService(); - } +// +static void ScopedServiceBecomesSingleton() +{ + var services = new ServiceCollection(); + services.AddScoped(); - // Not within a scope, becomes a singleton - Bar avoid = serviceProvider.GetRequiredService(); - } - // + using ServiceProvider serviceProvider = services.BuildServiceProvider(validateScopes: true); + using (IServiceScope scope = serviceProvider.CreateScope()) + { + // Correctly scoped resolution + Bar correct = scope.ServiceProvider.GetRequiredService(); } + + // Not within a scope, becomes a singleton + Bar avoid = serviceProvider.GetRequiredService(); } +// diff --git a/docs/core/extensions/snippets/configuration/di-anti-patterns/di-anti-patterns.csproj b/docs/core/extensions/snippets/configuration/di-anti-patterns/di-anti-patterns.csproj index b7c6062d81597..d780f50108c75 100644 --- a/docs/core/extensions/snippets/configuration/di-anti-patterns/di-anti-patterns.csproj +++ b/docs/core/extensions/snippets/configuration/di-anti-patterns/di-anti-patterns.csproj @@ -1,7 +1,7 @@ - + - net7.0 + net8.0 enable true DependencyInjection.AntiPatterns diff --git a/docs/core/extensions/snippets/configuration/options-action/options-action.csproj b/docs/core/extensions/snippets/configuration/options-action/options-action.csproj index a0aaad458f5ce..51d3ee875660a 100644 --- a/docs/core/extensions/snippets/configuration/options-action/options-action.csproj +++ b/docs/core/extensions/snippets/configuration/options-action/options-action.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true Options.Action diff --git a/docs/core/extensions/snippets/configuration/options-configparam/options-configparam.csproj b/docs/core/extensions/snippets/configuration/options-configparam/options-configparam.csproj index 307ebbc560515..68da9263487ab 100644 --- a/docs/core/extensions/snippets/configuration/options-configparam/options-configparam.csproj +++ b/docs/core/extensions/snippets/configuration/options-configparam/options-configparam.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true Options.ConfigParam diff --git a/docs/core/extensions/snippets/configuration/options-noparams/options-noparams.csproj b/docs/core/extensions/snippets/configuration/options-noparams/options-noparams.csproj index c1d91b744ac53..12d381e0b39c5 100644 --- a/docs/core/extensions/snippets/configuration/options-noparams/options-noparams.csproj +++ b/docs/core/extensions/snippets/configuration/options-noparams/options-noparams.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true Options.NoParams diff --git a/docs/core/extensions/snippets/configuration/options-object/options-object.csproj b/docs/core/extensions/snippets/configuration/options-object/options-object.csproj index 741c6bc175c13..196926816a9ce 100644 --- a/docs/core/extensions/snippets/configuration/options-object/options-object.csproj +++ b/docs/core/extensions/snippets/configuration/options-object/options-object.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true Options.Object diff --git a/docs/core/extensions/snippets/configuration/options-postconfig/options-postconfig.csproj b/docs/core/extensions/snippets/configuration/options-postconfig/options-postconfig.csproj index 177fb96310088..b2e1b66a400c6 100644 --- a/docs/core/extensions/snippets/configuration/options-postconfig/options-postconfig.csproj +++ b/docs/core/extensions/snippets/configuration/options-postconfig/options-postconfig.csproj @@ -2,14 +2,14 @@ Exe - net7.0 + net8.0 enable true Options.PostConfig - + diff --git a/docs/core/extensions/snippets/configuration/options-validation-onstart/options-validation-onstart.csproj b/docs/core/extensions/snippets/configuration/options-validation-onstart/options-validation-onstart.csproj index d04d61ee0f7fe..c913781c5a42b 100644 --- a/docs/core/extensions/snippets/configuration/options-validation-onstart/options-validation-onstart.csproj +++ b/docs/core/extensions/snippets/configuration/options-validation-onstart/options-validation-onstart.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true Options.ValidateOnStart diff --git a/docs/core/extensions/snippets/configuration/worker-scope/Worker.cs b/docs/core/extensions/snippets/configuration/worker-scope/Worker.cs index c14443548b035..d6f0af492595f 100644 --- a/docs/core/extensions/snippets/configuration/worker-scope/Worker.cs +++ b/docs/core/extensions/snippets/configuration/worker-scope/Worker.cs @@ -1,43 +1,40 @@ namespace WorkerScope.Example; -public sealed class Worker : BackgroundService +public sealed class Worker( + ILogger logger, + IServiceScopeFactory serviceScopeFactory) + : BackgroundService { - private readonly ILogger _logger; - private readonly IServiceScopeFactory _serviceScopeFactory; - - public Worker(ILogger logger, IServiceScopeFactory serviceScopeFactory) => - (_logger, _serviceScopeFactory) = (logger, serviceScopeFactory); - protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { - using (IServiceScope scope = _serviceScopeFactory.CreateScope()) + using (IServiceScope scope = serviceScopeFactory.CreateScope()) { try { - _logger.LogInformation( + logger.LogInformation( "Starting scoped work, provider hash: {hash}.", scope.ServiceProvider.GetHashCode()); var store = scope.ServiceProvider.GetRequiredService(); var next = await store.GetNextAsync(); - _logger.LogInformation("{next}", next); + logger.LogInformation("{next}", next); var processor = scope.ServiceProvider.GetRequiredService(); await processor.ProcessAsync(next); - _logger.LogInformation("Processing {name}.", next.Name); + logger.LogInformation("Processing {name}.", next.Name); var relay = scope.ServiceProvider.GetRequiredService(); await relay.RelayAsync(next); - _logger.LogInformation("Processed results have been relayed."); + logger.LogInformation("Processed results have been relayed."); var marked = await store.MarkAsync(next); - _logger.LogInformation("Marked as processed: {next}", marked); + logger.LogInformation("Marked as processed: {next}", marked); } finally { - _logger.LogInformation( + logger.LogInformation( "Finished scoped work, provider hash: {hash}.{nl}", scope.ServiceProvider.GetHashCode(), Environment.NewLine); } diff --git a/docs/core/extensions/snippets/configuration/worker-scope/worker-scope.csproj b/docs/core/extensions/snippets/configuration/worker-scope/worker-scope.csproj index 55397db5e3a99..4eb0ea041d780 100644 --- a/docs/core/extensions/snippets/configuration/worker-scope/worker-scope.csproj +++ b/docs/core/extensions/snippets/configuration/worker-scope/worker-scope.csproj @@ -1,13 +1,13 @@  - net7.0 + net8.0 enable true WorkerScope.Example - + diff --git a/docs/core/extensions/snippets/configuration/worker-service/Worker.cs b/docs/core/extensions/snippets/configuration/worker-service/Worker.cs index 27d6eba926964..7f3605b6ffe17 100644 --- a/docs/core/extensions/snippets/configuration/worker-service/Worker.cs +++ b/docs/core/extensions/snippets/configuration/worker-service/Worker.cs @@ -1,17 +1,12 @@ namespace WorkerService.Example; -public sealed class Worker : BackgroundService +public sealed class Worker(ILogger logger) : BackgroundService { - private readonly ILogger _logger; - - public Worker(ILogger logger) => - _logger = logger; - protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { - _logger.LogInformation("Worker running at: {Time}", DateTimeOffset.UtcNow); + logger.LogInformation("Worker running at: {Time}", DateTimeOffset.UtcNow); await Task.Delay(1_000, stoppingToken); } } diff --git a/docs/core/extensions/snippets/configuration/worker-service/worker-service.csproj b/docs/core/extensions/snippets/configuration/worker-service/worker-service.csproj index ec63b28cec2b6..29eb220777840 100644 --- a/docs/core/extensions/snippets/configuration/worker-service/worker-service.csproj +++ b/docs/core/extensions/snippets/configuration/worker-service/worker-service.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable true dotnet-worker_service-42C16A5C-9E2E-4001-A935-0158BC6A5D10 diff --git a/docs/core/extensions/snippets/fileglobbing/example/example.csproj b/docs/core/extensions/snippets/fileglobbing/example/example.csproj index cf99e8b94c85f..412d1524d8c1f 100644 --- a/docs/core/extensions/snippets/fileglobbing/example/example.csproj +++ b/docs/core/extensions/snippets/fileglobbing/example/example.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true FileGlobbing.Example diff --git a/docs/core/extensions/snippets/http/basic/ItemService.cs b/docs/core/extensions/snippets/http/basic/ItemService.cs index 3d79086f6cbe1..94c9bc8872db4 100644 --- a/docs/core/extensions/snippets/http/basic/ItemService.cs +++ b/docs/core/extensions/snippets/http/basic/ItemService.cs @@ -5,11 +5,8 @@ namespace BasicHttp.Example; -public sealed class ItemService : IDisposable +public sealed class ItemService(HttpClient httpClient) : IDisposable { - private readonly HttpClient _httpClient = null!; - - public ItemService(HttpClient httpClient) => _httpClient = httpClient; // public async Task CreateItemAsync(Item item) @@ -20,7 +17,7 @@ public async Task CreateItemAsync(Item item) MediaTypeNames.Application.Json); using HttpResponseMessage httpResponse = - await _httpClient.PostAsync("/api/items", json); + await httpClient.PostAsync("/api/items", json); httpResponse.EnsureSuccessStatusCode(); } @@ -34,7 +31,7 @@ public async Task UpdateItemAsync(Item item) MediaTypeNames.Application.Json); using HttpResponseMessage httpResponse = - await _httpClient.PutAsync($"/api/items/{item.Id}", json); + await httpClient.PutAsync($"/api/items/{item.Id}", json); httpResponse.EnsureSuccessStatusCode(); } @@ -43,11 +40,11 @@ public async Task UpdateItemAsync(Item item) public async Task DeleteItemAsync(Guid id) { using HttpResponseMessage httpResponse = - await _httpClient.DeleteAsync($"/api/items/{id}"); + await httpClient.DeleteAsync($"/api/items/{id}"); httpResponse.EnsureSuccessStatusCode(); } // - void IDisposable.Dispose() => _httpClient?.Dispose(); + void IDisposable.Dispose() => httpClient?.Dispose(); } diff --git a/docs/core/extensions/snippets/http/basic/TodoService.cs b/docs/core/extensions/snippets/http/basic/TodoService.cs index 9318c276b7af0..e8425b5ddaee8 100644 --- a/docs/core/extensions/snippets/http/basic/TodoService.cs +++ b/docs/core/extensions/snippets/http/basic/TodoService.cs @@ -5,20 +5,14 @@ namespace BasicHttp.Example; -public sealed class TodoService +public sealed class TodoService( + IHttpClientFactory httpClientFactory, + ILogger logger) { - private readonly IHttpClientFactory _httpClientFactory = null!; - private readonly ILogger _logger = null!; - - public TodoService( - IHttpClientFactory httpClientFactory, - ILogger logger) => - (_httpClientFactory, _logger) = (httpClientFactory, logger); - public async Task GetUserTodosAsync(int userId) { // Create the client - using HttpClient client = _httpClientFactory.CreateClient(); + using HttpClient client = httpClientFactory.CreateClient(); try { @@ -28,13 +22,13 @@ public async Task GetUserTodosAsync(int userId) $"https://jsonplaceholder.typicode.com/todos?userId={userId}", new JsonSerializerOptions(JsonSerializerDefaults.Web)); - return todos ?? Array.Empty(); + return todos ?? []; } catch (Exception ex) { - _logger.LogError("Error getting something fun to say: {Error}", ex); + logger.LogError("Error getting something fun to say: {Error}", ex); } - return Array.Empty(); + return []; } } diff --git a/docs/core/extensions/snippets/http/basic/basic.csproj b/docs/core/extensions/snippets/http/basic/basic.csproj index e1c938173c5ac..e789afbf5f0a8 100644 --- a/docs/core/extensions/snippets/http/basic/basic.csproj +++ b/docs/core/extensions/snippets/http/basic/basic.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true BasicHttp.Example diff --git a/docs/core/extensions/snippets/http/configurehandler/TodoService.cs b/docs/core/extensions/snippets/http/configurehandler/TodoService.cs index d8ca400644296..624a12ee546f0 100644 --- a/docs/core/extensions/snippets/http/configurehandler/TodoService.cs +++ b/docs/core/extensions/snippets/http/configurehandler/TodoService.cs @@ -6,24 +6,16 @@ namespace ConfigureHttpHandler.Example; -public sealed class TodoService +public sealed class TodoService( + IHttpClientFactory httpClientFactory, + IConfiguration configuration, + ILogger logger) { - private readonly IHttpClientFactory _httpClientFactory = null!; - private readonly IConfiguration _configuration = null!; - private readonly ILogger _logger = null!; - - public TodoService( - IHttpClientFactory httpClientFactory, - IConfiguration configuration, - ILogger logger) => - (_httpClientFactory, _configuration, _logger) = - (httpClientFactory, configuration, logger); - public async Task GetUserTodosAsync(int userId) { // Create the client const string name = "ConfigureHttpHandler.Example"; - using HttpClient client = _httpClientFactory.CreateClient(name); + using HttpClient client = httpClientFactory.CreateClient(name); try { @@ -33,13 +25,13 @@ public async Task GetUserTodosAsync(int userId) $"todos?userId={userId}", new JsonSerializerOptions(JsonSerializerDefaults.Web)); - return todos ?? Array.Empty(); + return todos ?? []; } catch (Exception ex) { - _logger.LogError("Error getting something fun to say: {Error}", ex); + logger.LogError("Error getting something fun to say: {Error}", ex); } - return Array.Empty(); + return []; } } diff --git a/docs/core/extensions/snippets/http/configurehandler/configurehandler.csproj b/docs/core/extensions/snippets/http/configurehandler/configurehandler.csproj index ac8e2e7a4dfdc..91d2df8f74d3f 100644 --- a/docs/core/extensions/snippets/http/configurehandler/configurehandler.csproj +++ b/docs/core/extensions/snippets/http/configurehandler/configurehandler.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable enable ConfigureHttpHandler.Example diff --git a/docs/core/extensions/snippets/http/generated/generated.csproj b/docs/core/extensions/snippets/http/generated/generated.csproj index 00e83bc5b2159..190c3d25ffdd5 100644 --- a/docs/core/extensions/snippets/http/generated/generated.csproj +++ b/docs/core/extensions/snippets/http/generated/generated.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true GeneratedHttp.Example diff --git a/docs/core/extensions/snippets/http/http3/http3test.csproj b/docs/core/extensions/snippets/http/http3/http3test.csproj index bc8037231257b..8201792952a21 100644 --- a/docs/core/extensions/snippets/http/http3/http3test.csproj +++ b/docs/core/extensions/snippets/http/http3/http3test.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable enable diff --git a/docs/core/extensions/snippets/http/named/TodoService.cs b/docs/core/extensions/snippets/http/named/TodoService.cs index f25cf7fbb9500..0cf619b0acd58 100644 --- a/docs/core/extensions/snippets/http/named/TodoService.cs +++ b/docs/core/extensions/snippets/http/named/TodoService.cs @@ -33,13 +33,13 @@ public async Task GetUserTodosAsync(int userId) $"todos?userId={userId}", new JsonSerializerOptions(JsonSerializerDefaults.Web)); - return todos ?? Array.Empty(); + return todos ?? []; } catch (Exception ex) { _logger.LogError("Error getting something fun to say: {Error}", ex); } - return Array.Empty(); + return []; } } diff --git a/docs/core/extensions/snippets/http/named/named.csproj b/docs/core/extensions/snippets/http/named/named.csproj index e5ead54556f5e..7529f3b01472f 100644 --- a/docs/core/extensions/snippets/http/named/named.csproj +++ b/docs/core/extensions/snippets/http/named/named.csproj @@ -1,8 +1,8 @@ - + Exe - net7.0 + net8.0 enable true NamedHttp.Example diff --git a/docs/core/extensions/snippets/http/shared/shared.csproj b/docs/core/extensions/snippets/http/shared/shared.csproj index f8f28555b334f..73c93b754b730 100644 --- a/docs/core/extensions/snippets/http/shared/shared.csproj +++ b/docs/core/extensions/snippets/http/shared/shared.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable true Shared diff --git a/docs/core/extensions/snippets/http/typed/TodoService.cs b/docs/core/extensions/snippets/http/typed/TodoService.cs index 50ba635327012..7490238ea788d 100644 --- a/docs/core/extensions/snippets/http/typed/TodoService.cs +++ b/docs/core/extensions/snippets/http/typed/TodoService.cs @@ -5,35 +5,29 @@ namespace TypedHttp.Example; -public sealed class TodoService : IDisposable +public sealed class TodoService( + HttpClient httpClient, + ILogger logger) : IDisposable { - private readonly HttpClient _httpClient = null!; - private readonly ILogger _logger = null!; - - public TodoService( - HttpClient httpClient, - ILogger logger) => - (_httpClient, _logger) = (httpClient, logger); - public async Task GetUserTodosAsync(int userId) { try { // Make HTTP GET request // Parse JSON response deserialize into Todo type - Todo[]? todos = await _httpClient.GetFromJsonAsync( + Todo[]? todos = await httpClient.GetFromJsonAsync( $"todos?userId={userId}", new JsonSerializerOptions(JsonSerializerDefaults.Web)); - return todos ?? Array.Empty(); + return todos ?? []; } catch (Exception ex) { - _logger.LogError("Error getting something fun to say: {Error}", ex); + logger.LogError("Error getting something fun to say: {Error}", ex); } - return Array.Empty(); + return []; } - public void Dispose() => _httpClient?.Dispose(); + public void Dispose() => httpClient?.Dispose(); } diff --git a/docs/core/extensions/snippets/http/typed/typed.csproj b/docs/core/extensions/snippets/http/typed/typed.csproj index bbb9862a61e9e..b44c0fa2dc1a6 100644 --- a/docs/core/extensions/snippets/http/typed/typed.csproj +++ b/docs/core/extensions/snippets/http/typed/typed.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true TypedHttp.Example diff --git a/docs/core/extensions/snippets/localization/example/MessageService.cs b/docs/core/extensions/snippets/localization/example/MessageService.cs index a1f3ffb9aa6d4..69cb12961363b 100644 --- a/docs/core/extensions/snippets/localization/example/MessageService.cs +++ b/docs/core/extensions/snippets/localization/example/MessageService.cs @@ -3,17 +3,12 @@ namespace Localization.Example; -public sealed class MessageService +public sealed class MessageService(IStringLocalizer localizer) { - private readonly IStringLocalizer _localizer = null!; - - public MessageService(IStringLocalizer localizer) => - _localizer = localizer; - - [return: NotNullIfNotNull(nameof(_localizer))] + [return: NotNullIfNotNull(nameof(localizer))] public string? GetGreetingMessage() { - LocalizedString localizedString = _localizer["GreetingMessage"]; + LocalizedString localizedString = localizer["GreetingMessage"]; return localizedString; } } diff --git a/docs/core/extensions/snippets/localization/example/ParameterizedMessageService.cs b/docs/core/extensions/snippets/localization/example/ParameterizedMessageService.cs index 827c6f710c0c7..b34d73a0f7bd3 100644 --- a/docs/core/extensions/snippets/localization/example/ParameterizedMessageService.cs +++ b/docs/core/extensions/snippets/localization/example/ParameterizedMessageService.cs @@ -3,12 +3,10 @@ namespace Localization.Example; -public class ParameterizedMessageService +public class ParameterizedMessageService(IStringLocalizerFactory factory) { - private readonly IStringLocalizer _localizer = null!; - - public ParameterizedMessageService(IStringLocalizerFactory factory) => - _localizer = factory.Create(typeof(ParameterizedMessageService)); + private readonly IStringLocalizer _localizer = + factory.Create(typeof(ParameterizedMessageService)); [return: NotNullIfNotNull(nameof(_localizer))] public string? GetFormattedMessage(DateTime dateTime, double dinnerPrice) diff --git a/docs/core/extensions/snippets/localization/example/example.csproj b/docs/core/extensions/snippets/localization/example/example.csproj index 261e358b31838..99efc6a3c7756 100644 --- a/docs/core/extensions/snippets/localization/example/example.csproj +++ b/docs/core/extensions/snippets/localization/example/example.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true Localization.Example diff --git a/docs/core/extensions/snippets/logging/console-formatter-custom-with-config/CustomTimePrefixingFormatter.cs b/docs/core/extensions/snippets/logging/console-formatter-custom-with-config/CustomTimePrefixingFormatter.cs index 0a7c9810709d8..9fbf95f3e08d0 100644 --- a/docs/core/extensions/snippets/logging/console-formatter-custom-with-config/CustomTimePrefixingFormatter.cs +++ b/docs/core/extensions/snippets/logging/console-formatter-custom-with-config/CustomTimePrefixingFormatter.cs @@ -10,11 +10,14 @@ public sealed class CustomTimePrefixingFormatter : ConsoleFormatter, IDisposable private readonly IDisposable? _optionsReloadToken; private CustomWrappingConsoleFormatterOptions _formatterOptions; - public CustomTimePrefixingFormatter(IOptionsMonitor options) + public CustomTimePrefixingFormatter( + IOptionsMonitor options) // Case insensitive - : base(nameof(CustomTimePrefixingFormatter)) => - (_optionsReloadToken, _formatterOptions) = - (options.OnChange(ReloadLoggerOptions), options.CurrentValue); + : base(nameof(CustomTimePrefixingFormatter)) + { + _optionsReloadToken = options.OnChange(ReloadLoggerOptions); + _formatterOptions = options.CurrentValue; + } private void ReloadLoggerOptions(CustomWrappingConsoleFormatterOptions options) => _formatterOptions = options; diff --git a/docs/core/extensions/snippets/logging/console-formatter-custom-with-config/console-formatter-custom-with-config.csproj b/docs/core/extensions/snippets/logging/console-formatter-custom-with-config/console-formatter-custom-with-config.csproj index 3bfec44b94d32..d0f8e8f3a57fb 100644 --- a/docs/core/extensions/snippets/logging/console-formatter-custom-with-config/console-formatter-custom-with-config.csproj +++ b/docs/core/extensions/snippets/logging/console-formatter-custom-with-config/console-formatter-custom-with-config.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true Console.ExampleFormatters.CustomWithConfig diff --git a/docs/core/extensions/snippets/logging/console-formatter-custom/console-formatter-custom.csproj b/docs/core/extensions/snippets/logging/console-formatter-custom/console-formatter-custom.csproj index 294f07cac7355..80a178a0855cd 100644 --- a/docs/core/extensions/snippets/logging/console-formatter-custom/console-formatter-custom.csproj +++ b/docs/core/extensions/snippets/logging/console-formatter-custom/console-formatter-custom.csproj @@ -2,14 +2,14 @@ Exe - net7.0 + net8.0 enable true Console.ExampleFormatters.Custom - + diff --git a/docs/core/extensions/snippets/logging/console-formatter-json/console-formatter-json.csproj b/docs/core/extensions/snippets/logging/console-formatter-json/console-formatter-json.csproj index fab918d69c783..17c8b594666d2 100644 --- a/docs/core/extensions/snippets/logging/console-formatter-json/console-formatter-json.csproj +++ b/docs/core/extensions/snippets/logging/console-formatter-json/console-formatter-json.csproj @@ -1,8 +1,8 @@ - + Exe - net7.0 + net8.0 enable true Console.ExampleFormatters.Json diff --git a/docs/core/extensions/snippets/logging/console-formatter-simple/console-formatter-simple.csproj b/docs/core/extensions/snippets/logging/console-formatter-simple/console-formatter-simple.csproj index 7bdcb5112724d..d60817550f33e 100644 --- a/docs/core/extensions/snippets/logging/console-formatter-simple/console-formatter-simple.csproj +++ b/docs/core/extensions/snippets/logging/console-formatter-simple/console-formatter-simple.csproj @@ -1,8 +1,8 @@ - + Exe - net7.0 + net8.0 enable true Console.ExampleFormatters.Simple diff --git a/docs/core/extensions/snippets/logging/console-formatter-systemd/console-formatter-systemd.csproj b/docs/core/extensions/snippets/logging/console-formatter-systemd/console-formatter-systemd.csproj index 20046b9a6aca6..843bdc37f5e3a 100644 --- a/docs/core/extensions/snippets/logging/console-formatter-systemd/console-formatter-systemd.csproj +++ b/docs/core/extensions/snippets/logging/console-formatter-systemd/console-formatter-systemd.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true Console.ExampleFormatters.Systemd diff --git a/docs/core/extensions/snippets/logging/di-without-host/Program.cs b/docs/core/extensions/snippets/logging/di-without-host/Program.cs index c101e0732e8aa..852304e8e5e51 100644 --- a/docs/core/extensions/snippets/logging/di-without-host/Program.cs +++ b/docs/core/extensions/snippets/logging/di-without-host/Program.cs @@ -13,17 +13,10 @@ // Do some pretend work service.DoSomeWork(10, 20); -class ExampleService +class ExampleService(ILogger logger) { - private readonly ILogger _logger; - - public ExampleService(ILogger logger) - { - _logger = logger; - } - public void DoSomeWork(int x, int y) { - _logger.LogInformation("DoSomeWork was called. x={X}, y={Y}", x, y); + logger.LogInformation("DoSomeWork was called. x={X}, y={Y}", x, y); } } diff --git a/docs/core/extensions/snippets/logging/di-without-host/di-without-host.csproj b/docs/core/extensions/snippets/logging/di-without-host/di-without-host.csproj index 77faf98eb712d..4a2ad643053df 100644 --- a/docs/core/extensions/snippets/logging/di-without-host/di-without-host.csproj +++ b/docs/core/extensions/snippets/logging/di-without-host/di-without-host.csproj @@ -2,16 +2,16 @@ Exe - net7.0 + net8.0 NonHost.Example enable enable - - - + + + diff --git a/docs/core/extensions/snippets/logging/getting-started-logger-message/getting-started-logger-message.csproj b/docs/core/extensions/snippets/logging/getting-started-logger-message/getting-started-logger-message.csproj index bbc43ab46a463..16ad00ccdc8da 100644 --- a/docs/core/extensions/snippets/logging/getting-started-logger-message/getting-started-logger-message.csproj +++ b/docs/core/extensions/snippets/logging/getting-started-logger-message/getting-started-logger-message.csproj @@ -2,14 +2,14 @@ Exe - net7.0 + net8.0 enable enable - - + + diff --git a/docs/core/extensions/snippets/logging/getting-started-open-telemetry/getting-started-open-telemetry.csproj b/docs/core/extensions/snippets/logging/getting-started-open-telemetry/getting-started-open-telemetry.csproj index d11f549dc91fe..b98c4b29b69d9 100644 --- a/docs/core/extensions/snippets/logging/getting-started-open-telemetry/getting-started-open-telemetry.csproj +++ b/docs/core/extensions/snippets/logging/getting-started-open-telemetry/getting-started-open-telemetry.csproj @@ -2,14 +2,14 @@ Exe - net7.0 + net8.0 enable enable - - + + diff --git a/docs/core/extensions/snippets/logging/getting-started-type-category-name/getting-started-type-category-name.csproj b/docs/core/extensions/snippets/logging/getting-started-type-category-name/getting-started-type-category-name.csproj index bbc43ab46a463..16ad00ccdc8da 100644 --- a/docs/core/extensions/snippets/logging/getting-started-type-category-name/getting-started-type-category-name.csproj +++ b/docs/core/extensions/snippets/logging/getting-started-type-category-name/getting-started-type-category-name.csproj @@ -2,14 +2,14 @@ Exe - net7.0 + net8.0 enable enable - - + + diff --git a/docs/core/extensions/snippets/logging/getting-started/getting-started.csproj b/docs/core/extensions/snippets/logging/getting-started/getting-started.csproj index bbc43ab46a463..16ad00ccdc8da 100644 --- a/docs/core/extensions/snippets/logging/getting-started/getting-started.csproj +++ b/docs/core/extensions/snippets/logging/getting-started/getting-started.csproj @@ -2,14 +2,14 @@ Exe - net7.0 + net8.0 enable enable - - + + diff --git a/docs/core/extensions/snippets/logging/library-authors/DiExampleService.cs b/docs/core/extensions/snippets/logging/library-authors/DiExampleService.cs index da597f89e8e55..61dc80baab0ac 100644 --- a/docs/core/extensions/snippets/logging/library-authors/DiExampleService.cs +++ b/docs/core/extensions/snippets/logging/library-authors/DiExampleService.cs @@ -2,19 +2,14 @@ namespace Logging.LibraryAuthors; -public class DiExampleService +public class DiExampleService(ILogger logger) { - private readonly ILogger _logger; - - public DiExampleService(ILogger logger) => - _logger = logger; - public void ProcessProductSale(Product product, int sold) { // Product sale processing logic. // Log results... - _logger.LogProductSaleDetails( + logger.LogProductSaleDetails( quantity: sold, description: product.GetFriendlyProductDescription()); } diff --git a/docs/core/extensions/snippets/logging/library-authors/library-authors.csproj b/docs/core/extensions/snippets/logging/library-authors/library-authors.csproj index a2713ed5f2dc9..838dac2498b8b 100644 --- a/docs/core/extensions/snippets/logging/library-authors/library-authors.csproj +++ b/docs/core/extensions/snippets/logging/library-authors/library-authors.csproj @@ -2,14 +2,14 @@ Exe - net7.0 + net8.0 enable true Logging.LibraryAuthors - + diff --git a/docs/core/extensions/snippets/logging/logger-message-generator/logger-message-generator.csproj b/docs/core/extensions/snippets/logging/logger-message-generator/logger-message-generator.csproj index b06fe8368141a..d0aa617f0e8d0 100644 --- a/docs/core/extensions/snippets/logging/logger-message-generator/logger-message-generator.csproj +++ b/docs/core/extensions/snippets/logging/logger-message-generator/logger-message-generator.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable true LoggerMessage.Generator diff --git a/docs/core/extensions/snippets/logging/logging.sln b/docs/core/extensions/snippets/logging/logging.sln index 3846b27db26a5..99c7ea57b6205 100644 --- a/docs/core/extensions/snippets/logging/logging.sln +++ b/docs/core/extensions/snippets/logging/logging.sln @@ -27,11 +27,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "getting-started-type-catego EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "getting-started-open-telemetry", "getting-started-open-telemetry\getting-started-open-telemetry.csproj", "{D711C802-982D-4712-B70D-A3179C4313CC}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "aspnet-mvc", "aspnet-mvc\aspnet-mvc.csproj", "{D169B00F-66E9-4500-879D-487FE0E09F23}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "di-without-host", "di-without-host\di-without-host.csproj", "{5191561E-658B-485D-B006-760C65218FA5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "minimal-web", "minimal-web\minimal-web.csproj", "{631A9547-C326-4BE6-A8C1-AB070AB0025D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "minimal-web", "minimal-web\minimal-web.csproj", "{631A9547-C326-4BE6-A8C1-AB070AB0025D}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -87,10 +85,6 @@ Global {D711C802-982D-4712-B70D-A3179C4313CC}.Debug|Any CPU.Build.0 = Debug|Any CPU {D711C802-982D-4712-B70D-A3179C4313CC}.Release|Any CPU.ActiveCfg = Release|Any CPU {D711C802-982D-4712-B70D-A3179C4313CC}.Release|Any CPU.Build.0 = Release|Any CPU - {D169B00F-66E9-4500-879D-487FE0E09F23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D169B00F-66E9-4500-879D-487FE0E09F23}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D169B00F-66E9-4500-879D-487FE0E09F23}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D169B00F-66E9-4500-879D-487FE0E09F23}.Release|Any CPU.Build.0 = Release|Any CPU {5191561E-658B-485D-B006-760C65218FA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5191561E-658B-485D-B006-760C65218FA5}.Debug|Any CPU.Build.0 = Debug|Any CPU {5191561E-658B-485D-B006-760C65218FA5}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/docs/core/extensions/snippets/logging/minimal-web/Program.cs b/docs/core/extensions/snippets/logging/minimal-web/Program.cs index cbb0fd3be9386..88a9e82bf5e9c 100644 --- a/docs/core/extensions/snippets/logging/minimal-web/Program.cs +++ b/docs/core/extensions/snippets/logging/minimal-web/Program.cs @@ -1,8 +1,12 @@ var builder = WebApplication.CreateBuilder(args); + builder.Services.AddSingleton(); + var app = builder.Build(); + var handler = app.Services.GetRequiredService(); app.MapGet("/", handler.HandleRequest); + app.Run(); partial class ExampleHandler(ILogger logger) diff --git a/docs/core/extensions/snippets/logging/worker-service-options/PriorityQueue.cs b/docs/core/extensions/snippets/logging/worker-service-options/PriorityQueue.cs index 53d817fcd77ab..416e2efca6e4c 100644 --- a/docs/core/extensions/snippets/logging/worker-service-options/PriorityQueue.cs +++ b/docs/core/extensions/snippets/logging/worker-service-options/PriorityQueue.cs @@ -2,8 +2,8 @@ public class PriorityQueue { - private readonly List _workItems = new() - { + private readonly List _workItems = + [ new WorkItem("Validate collection", Priority.High), new WorkItem("Health check network", Priority.Low), new WorkItem("Ping weather service", Priority.Deferred), @@ -11,7 +11,7 @@ public class PriorityQueue new WorkItem("Verify communications", Priority.Extreme), new WorkItem("Set process state", Priority.Deferred), new WorkItem("Enter pooling [contention]", Priority.Medium) - }; + ]; public WorkItem? ProcessNextHighestPriority() { diff --git a/docs/core/extensions/snippets/logging/worker-service-options/Worker.cs b/docs/core/extensions/snippets/logging/worker-service-options/Worker.cs index 3909f26e9cc7b..d51740f2c13cb 100644 --- a/docs/core/extensions/snippets/logging/worker-service-options/Worker.cs +++ b/docs/core/extensions/snippets/logging/worker-service-options/Worker.cs @@ -2,31 +2,27 @@ namespace WorkerServiceOptions.Example; -public sealed class Worker : BackgroundService +public sealed class Worker( + ILogger logger, + PriorityQueue priorityQueue) : BackgroundService { - private readonly ILogger _logger; - private readonly PriorityQueue _priorityQueue; - - public Worker(ILogger logger, PriorityQueue priorityQueue) => - (_logger, _priorityQueue) = (logger, priorityQueue); - protected override async Task ExecuteAsync( CancellationToken stoppingToken) { - using IDisposable? scope = _logger.ProcessingWorkScope(DateTime.Now); + using IDisposable? scope = logger.ProcessingWorkScope(DateTime.Now); while (!stoppingToken.IsCancellationRequested) { - WorkItem? nextItem = _priorityQueue.ProcessNextHighestPriority(); + WorkItem? nextItem = priorityQueue.ProcessNextHighestPriority(); try { if (nextItem is not null) { - _logger.PriorityItemProcessed(nextItem); + logger.PriorityItemProcessed(nextItem); } } catch (Exception ex) { - _logger.FailedToProcessWorkItem(ex); + logger.FailedToProcessWorkItem(ex); } await Task.Delay(1_000, stoppingToken); diff --git a/docs/core/extensions/snippets/logging/worker-service-options/worker-service-options.csproj b/docs/core/extensions/snippets/logging/worker-service-options/worker-service-options.csproj index 8f6b13338aa6c..220dc9a5bcf1a 100644 --- a/docs/core/extensions/snippets/logging/worker-service-options/worker-service-options.csproj +++ b/docs/core/extensions/snippets/logging/worker-service-options/worker-service-options.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable true dotnet-worker_service-42C16A5C-9E2E-4001-A935-0158BC6A5D10 diff --git a/docs/core/extensions/snippets/ratelimit/http/ClientSideRateLimitedHandler.cs b/docs/core/extensions/snippets/ratelimit/http/ClientSideRateLimitedHandler.cs index e21a65a00b9b8..f4b1dc66eac28 100644 --- a/docs/core/extensions/snippets/ratelimit/http/ClientSideRateLimitedHandler.cs +++ b/docs/core/extensions/snippets/ratelimit/http/ClientSideRateLimitedHandler.cs @@ -1,15 +1,11 @@ -internal sealed class ClientSideRateLimitedHandler - : DelegatingHandler, IAsyncDisposable +internal sealed class ClientSideRateLimitedHandler( + RateLimiter limiter) + : DelegatingHandler(new HttpClientHandler()), IAsyncDisposable { - private readonly RateLimiter _rateLimiter; - - public ClientSideRateLimitedHandler(RateLimiter limiter) - : base(new HttpClientHandler()) => _rateLimiter = limiter; - protected override async Task SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { - using RateLimitLease lease = await _rateLimiter.AcquireAsync( + using RateLimitLease lease = await limiter.AcquireAsync( permitCount: 1, cancellationToken); if (lease.IsAcquired) @@ -32,7 +28,7 @@ protected override async Task SendAsync( async ValueTask IAsyncDisposable.DisposeAsync() { - await _rateLimiter.DisposeAsync().ConfigureAwait(false); + await limiter.DisposeAsync().ConfigureAwait(false); Dispose(disposing: false); GC.SuppressFinalize(this); @@ -44,7 +40,7 @@ protected override void Dispose(bool disposing) if (disposing) { - _rateLimiter.Dispose(); + limiter.Dispose(); } } } diff --git a/docs/core/extensions/snippets/ratelimit/http/http.csproj b/docs/core/extensions/snippets/ratelimit/http/http.csproj index fecba82eee047..d29482abdbca5 100644 --- a/docs/core/extensions/snippets/ratelimit/http/http.csproj +++ b/docs/core/extensions/snippets/ratelimit/http/http.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable enable diff --git a/docs/core/extensions/snippets/workers/6.0/.dockerignore b/docs/core/extensions/snippets/workers/.dockerignore similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/.dockerignore rename to docs/core/extensions/snippets/workers/.dockerignore diff --git a/docs/core/extensions/snippets/workers/6.0/background-service/App.WorkerService.csproj b/docs/core/extensions/snippets/workers/6.0/background-service/App.WorkerService.csproj deleted file mode 100644 index e26db198db5df..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/background-service/App.WorkerService.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - net6.0 - enable - true - App.WorkerService - Linux - - - - - - - diff --git a/docs/core/extensions/snippets/workers/6.0/background-service/Dockerfile b/docs/core/extensions/snippets/workers/6.0/background-service/Dockerfile deleted file mode 100644 index 3c9cf71a0a3cb..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/background-service/Dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -# 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:6.0 AS base -WORKDIR /app - -FROM mcr.microsoft.com/dotnet/sdk:6.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"] diff --git a/docs/core/extensions/snippets/workers/6.0/background-service/Program.cs b/docs/core/extensions/snippets/workers/6.0/background-service/Program.cs deleted file mode 100644 index 6573d6c40f1bc..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/background-service/Program.cs +++ /dev/null @@ -1,10 +0,0 @@ -using App.WorkerService; - -IHostBuilder builder = Host.CreateDefaultBuilder(args) - .ConfigureServices(services => - { - services.AddHostedService(); - }); - -IHost host = builder.Build(); -host.Run(); diff --git a/docs/core/extensions/snippets/workers/6.0/background-service/Worker.cs b/docs/core/extensions/snippets/workers/6.0/background-service/Worker.cs deleted file mode 100644 index e7c658599116a..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/background-service/Worker.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace App.WorkerService; - -public sealed class Worker : BackgroundService -{ - private readonly ILogger _logger; - - public Worker(ILogger logger) - { - _logger = logger; - } - - protected override async Task ExecuteAsync(CancellationToken stoppingToken) - { - while (!stoppingToken.IsCancellationRequested) - { - _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); - await Task.Delay(1_000, stoppingToken); - } - } -} diff --git a/docs/core/extensions/snippets/workers/6.0/cloud-service/Program.cs b/docs/core/extensions/snippets/workers/6.0/cloud-service/Program.cs deleted file mode 100644 index c7b85c423fb7b..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/cloud-service/Program.cs +++ /dev/null @@ -1,8 +0,0 @@ -using App.CloudService; - -IHostBuilder builder = Host.CreateDefaultBuilder(args) - .ConfigureServices( - services => services.AddHostedService()); - -IHost host = builder.Build(); -host.Run(); diff --git a/docs/core/extensions/snippets/workers/6.0/queue-service/MonitorLoop.cs b/docs/core/extensions/snippets/workers/6.0/queue-service/MonitorLoop.cs deleted file mode 100644 index c369fbbbb7f3d..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/queue-service/MonitorLoop.cs +++ /dev/null @@ -1,74 +0,0 @@ -namespace App.QueueService; - -public sealed class MonitorLoop -{ - private readonly IBackgroundTaskQueue _taskQueue; - private readonly ILogger _logger; - private readonly CancellationToken _cancellationToken; - - public MonitorLoop( - IBackgroundTaskQueue taskQueue, - ILogger logger, - IHostApplicationLifetime applicationLifetime) - { - _taskQueue = taskQueue; - _logger = logger; - _cancellationToken = applicationLifetime.ApplicationStopping; - } - - public void StartMonitorLoop() - { - _logger.LogInformation($"{nameof(MonitorAsync)} loop is starting."); - - // Run a console user input loop in a background thread - Task.Run(async () => await MonitorAsync()); - } - - private async ValueTask MonitorAsync() - { - while (!_cancellationToken.IsCancellationRequested) - { - var keyStroke = Console.ReadKey(); - if (keyStroke.Key == ConsoleKey.W) - { - // Enqueue a background work item - await _taskQueue.QueueBackgroundWorkItemAsync(BuildWorkItemAsync); - } - } - } - - private async ValueTask BuildWorkItemAsync(CancellationToken token) - { - // Simulate three 5-second tasks to complete - // for each enqueued work item - - int delayLoop = 0; - var guid = Guid.NewGuid(); - - _logger.LogInformation("Queued work item {Guid} is starting.", guid); - - while (!token.IsCancellationRequested && delayLoop < 3) - { - try - { - await Task.Delay(TimeSpan.FromSeconds(5), token); - } - catch (OperationCanceledException) - { - // Prevent throwing if the Delay is cancelled - } - - ++ delayLoop; - - _logger.LogInformation("Queued work item {Guid} is running. {DelayLoop}/3", guid, delayLoop); - } - - string format = delayLoop switch - { - 3 => "Queued Background Task {Guid} is complete.", - _ => "Queued Background Task {Guid} was cancelled." - }; - - _logger.LogInformation(format, guid); - } -} diff --git a/docs/core/extensions/snippets/workers/6.0/queue-service/Program.cs b/docs/core/extensions/snippets/workers/6.0/queue-service/Program.cs deleted file mode 100644 index 8794c0f9ee343..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/queue-service/Program.cs +++ /dev/null @@ -1,25 +0,0 @@ -using App.QueueService; - -IHostBuilder builder = Host.CreateDefaultBuilder(args) - .ConfigureServices((context, services) => - { - services.AddSingleton(); - services.AddHostedService(); - services.AddSingleton(_ => - { - if (!int.TryParse(context.Configuration["QueueCapacity"], - out int queueCapacity)) - { - queueCapacity = 100; - } - - return new DefaultBackgroundTaskQueue(queueCapacity); - }); - }); - -IHost host = builder.Build(); - -MonitorLoop monitorLoop = host.Services.GetRequiredService()!; -monitorLoop.StartMonitorLoop(); - -host.Run(); diff --git a/docs/core/extensions/snippets/workers/6.0/queue-service/QueuedHostedService.cs b/docs/core/extensions/snippets/workers/6.0/queue-service/QueuedHostedService.cs deleted file mode 100644 index daccadeaf230d..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/queue-service/QueuedHostedService.cs +++ /dev/null @@ -1,52 +0,0 @@ -namespace App.QueueService; - -public sealed class QueuedHostedService : BackgroundService -{ - private readonly IBackgroundTaskQueue _taskQueue; - private readonly ILogger _logger; - - public QueuedHostedService( - IBackgroundTaskQueue taskQueue, - ILogger logger) => - (_taskQueue, _logger) = (taskQueue, logger); - - protected override Task ExecuteAsync(CancellationToken stoppingToken) - { - _logger.LogInformation( - $"{nameof(QueuedHostedService)} is running.{Environment.NewLine}" + - $"{Environment.NewLine}Tap W to add a work item to the " + - $"background queue.{Environment.NewLine}"); - - return ProcessTaskQueueAsync(stoppingToken); - } - - private async Task ProcessTaskQueueAsync(CancellationToken stoppingToken) - { - while (!stoppingToken.IsCancellationRequested) - { - try - { - Func? workItem = - await _taskQueue.DequeueAsync(stoppingToken); - - await workItem(stoppingToken); - } - catch (OperationCanceledException) - { - // Prevent throwing if stoppingToken was signaled - } - catch (Exception ex) - { - _logger.LogError(ex, "Error occurred executing task work item."); - } - } - } - - public override async Task StopAsync(CancellationToken stoppingToken) - { - _logger.LogInformation( - $"{nameof(QueuedHostedService)} is stopping."); - - await base.StopAsync(stoppingToken); - } -} diff --git a/docs/core/extensions/snippets/workers/6.0/scoped-service/DefaultScopedProcessingService.cs b/docs/core/extensions/snippets/workers/6.0/scoped-service/DefaultScopedProcessingService.cs deleted file mode 100644 index 55b6baa9bf3b2..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/scoped-service/DefaultScopedProcessingService.cs +++ /dev/null @@ -1,26 +0,0 @@ -namespace App.ScopedService; - -public sealed class DefaultScopedProcessingService : IScopedProcessingService -{ - private int _executionCount; - private readonly ILogger _logger; - - public DefaultScopedProcessingService( - ILogger logger) => - _logger = logger; - - public async Task DoWorkAsync(CancellationToken stoppingToken) - { - while (!stoppingToken.IsCancellationRequested) - { - ++ _executionCount; - - _logger.LogInformation( - "{ServiceName} working, execution count: {Count}", - nameof(DefaultScopedProcessingService), - _executionCount); - - await Task.Delay(10_000, stoppingToken); - } - } -} diff --git a/docs/core/extensions/snippets/workers/6.0/scoped-service/Program.cs b/docs/core/extensions/snippets/workers/6.0/scoped-service/Program.cs deleted file mode 100644 index be34f5db31556..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/scoped-service/Program.cs +++ /dev/null @@ -1,11 +0,0 @@ -using App.ScopedService; - -IHostBuilder builder = Host.CreateDefaultBuilder(args) - .ConfigureServices(services => - { - services.AddHostedService(); - services.AddScoped(); - }); - -IHost host = builder.Build(); -host.Run(); diff --git a/docs/core/extensions/snippets/workers/6.0/scoped-service/ScopedBackgroundService.cs b/docs/core/extensions/snippets/workers/6.0/scoped-service/ScopedBackgroundService.cs deleted file mode 100644 index fc0c6716ddd8f..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/scoped-service/ScopedBackgroundService.cs +++ /dev/null @@ -1,42 +0,0 @@ -namespace App.ScopedService; - -public sealed class ScopedBackgroundService : BackgroundService -{ - private readonly IServiceProvider _serviceProvider; - private readonly ILogger _logger; - - public ScopedBackgroundService( - IServiceProvider serviceProvider, - ILogger logger) => - (_serviceProvider, _logger) = (serviceProvider, logger); - - protected override async Task ExecuteAsync(CancellationToken stoppingToken) - { - _logger.LogInformation( - $"{nameof(ScopedBackgroundService)} is running."); - - await DoWorkAsync(stoppingToken); - } - - private async Task DoWorkAsync(CancellationToken stoppingToken) - { - _logger.LogInformation( - $"{nameof(ScopedBackgroundService)} is working."); - - using (IServiceScope scope = _serviceProvider.CreateScope()) - { - IScopedProcessingService scopedProcessingService = - scope.ServiceProvider.GetRequiredService(); - - await scopedProcessingService.DoWorkAsync(stoppingToken); - } - } - - public override async Task StopAsync(CancellationToken stoppingToken) - { - _logger.LogInformation( - $"{nameof(ScopedBackgroundService)} is stopping."); - - await base.StopAsync(stoppingToken); - } -} diff --git a/docs/core/extensions/snippets/workers/6.0/signal-completion-service/App.SignalCompletionService/App.SignalCompletionService.csproj b/docs/core/extensions/snippets/workers/6.0/signal-completion-service/App.SignalCompletionService/App.SignalCompletionService.csproj deleted file mode 100644 index 1603092f07b41..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/signal-completion-service/App.SignalCompletionService/App.SignalCompletionService.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - net6.0 - enable - enable - - - - - - diff --git a/docs/core/extensions/snippets/workers/6.0/signal-completion-service/App.SignalCompletionService/Program.cs b/docs/core/extensions/snippets/workers/6.0/signal-completion-service/App.SignalCompletionService/Program.cs deleted file mode 100644 index 7be63a7d513d4..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/signal-completion-service/App.SignalCompletionService/Program.cs +++ /dev/null @@ -1,10 +0,0 @@ -using App.SignalCompletionService; - -IHostBuilder builder = Host.CreateDefaultBuilder(args) - .ConfigureServices(services => - { - services.AddHostedService(); - }); - -IHost host = builder.Build(); -host.Run(); diff --git a/docs/core/extensions/snippets/workers/6.0/signal-completion-service/App.SignalCompletionService/Worker.cs b/docs/core/extensions/snippets/workers/6.0/signal-completion-service/App.SignalCompletionService/Worker.cs deleted file mode 100644 index 2edf4773b8506..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/signal-completion-service/App.SignalCompletionService/Worker.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace App.SignalCompletionService; - -public sealed class Worker : BackgroundService -{ - private readonly IHostApplicationLifetime _hostApplicationLifetime; - private readonly ILogger _logger; - - public Worker( - IHostApplicationLifetime hostApplicationLifetime, ILogger logger) => - (_hostApplicationLifetime, _logger) = (hostApplicationLifetime, logger); - - protected override async Task ExecuteAsync(CancellationToken stoppingToken) - { - // TODO: implement single execution logic here. - _logger.LogInformation( - "Worker running at: {time}", DateTimeOffset.Now); - - await Task.Delay(1000, stoppingToken); - - // When completed, the entire app host will stop. - _hostApplicationLifetime.StopApplication(); - } -} diff --git a/docs/core/extensions/snippets/workers/6.0/timer-service/App.TimerHostedService.csproj b/docs/core/extensions/snippets/workers/6.0/timer-service/App.TimerHostedService.csproj deleted file mode 100644 index 9cb21b4877d9c..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/timer-service/App.TimerHostedService.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - net6.0 - enable - true - App.TimerHostedService - - - - - - diff --git a/docs/core/extensions/snippets/workers/6.0/timer-service/Program.cs b/docs/core/extensions/snippets/workers/6.0/timer-service/Program.cs deleted file mode 100644 index b876b6eef70f9..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/timer-service/Program.cs +++ /dev/null @@ -1,10 +0,0 @@ -using App.TimerHostedService; - -IHostBuilder builder = Host.CreateDefaultBuilder(args) - .ConfigureServices(services => - { - services.AddHostedService(); - }); - -IHost host = builder.Build(); -host.Run(); diff --git a/docs/core/extensions/snippets/workers/6.0/timer-service/TimerService.cs b/docs/core/extensions/snippets/workers/6.0/timer-service/TimerService.cs deleted file mode 100644 index bad35e8559244..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/timer-service/TimerService.cs +++ /dev/null @@ -1,49 +0,0 @@ -namespace App.TimerHostedService; - -public sealed class TimerService : IHostedService, IAsyncDisposable -{ - private readonly Task _completedTask = Task.CompletedTask; - private readonly ILogger _logger; - private int _executionCount = 0; - private Timer? _timer; - - public TimerService(ILogger logger) => _logger = logger; - - public Task StartAsync(CancellationToken stoppingToken) - { - _logger.LogInformation("{Service} is running.", nameof(TimerHostedService)); - _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5)); - - return _completedTask; - } - - private void DoWork(object? state) - { - int count = Interlocked.Increment(ref _executionCount); - - _logger.LogInformation( - "{Service} is working, execution count: {Count:#,0}", - nameof(TimerHostedService), - count); - } - - public Task StopAsync(CancellationToken stoppingToken) - { - _logger.LogInformation( - "{Service} is stopping.", nameof(TimerHostedService)); - - _timer?.Change(Timeout.Infinite, 0); - - return _completedTask; - } - - public async ValueTask DisposeAsync() - { - if (_timer is IAsyncDisposable timer) - { - await timer.DisposeAsync(); - } - - _timer = null; - } -} diff --git a/docs/core/extensions/snippets/workers/6.0/windows-service-installer/App.WindowsService.Installer/App.WindowsService.Installer.vdproj b/docs/core/extensions/snippets/workers/6.0/windows-service-installer/App.WindowsService.Installer/App.WindowsService.Installer.vdproj deleted file mode 100644 index 32e017f11f399..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/windows-service-installer/App.WindowsService.Installer/App.WindowsService.Installer.vdproj +++ /dev/null @@ -1,756 +0,0 @@ -"DeployProject" -{ -"VSVersion" = "3:800" -"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}" -"IsWebType" = "8:FALSE" -"ProjectName" = "8:App.WindowsService.Installer" -"LanguageId" = "3:1033" -"CodePage" = "3:1252" -"UILanguageId" = "3:1033" -"SccProjectName" = "8:" -"SccLocalPath" = "8:" -"SccAuxPath" = "8:" -"SccProvider" = "8:" - "Hierarchy" - { - "Entry" - { - "MsmKey" = "8:_A7730A47EAAB4F7F81E968F30D8EBB3A" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - } - "Configurations" - { - "Debug" - { - "DisplayName" = "8:Debug" - "IsDebugOnly" = "11:TRUE" - "IsReleaseOnly" = "11:FALSE" - "OutputFilename" = "8:Debug\\App.WindowsService.Installer.msi" - "PackageFilesAs" = "3:2" - "PackageFileSize" = "3:-2147483648" - "CabType" = "3:1" - "Compression" = "3:2" - "SignOutput" = "11:FALSE" - "CertificateFile" = "8:" - "PrivateKeyFile" = "8:" - "TimeStampServer" = "8:" - "InstallerBootstrapper" = "3:2" - "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" - { - "Enabled" = "11:TRUE" - "PromptEnabled" = "11:TRUE" - "PrerequisitesLocation" = "2:1" - "Url" = "8:" - "ComponentsUrl" = "8:" - "Items" - { - "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.NetCore.CoreRuntime.6.0.x64" - { - "Name" = "8:.NET Runtime 6.0.2 (x64)" - "ProductCode" = "8:Microsoft.NetCore.CoreRuntime.6.0.x64" - } - } - } - } - "Release" - { - "DisplayName" = "8:Release" - "IsDebugOnly" = "11:FALSE" - "IsReleaseOnly" = "11:TRUE" - "OutputFilename" = "8:Release\\App.WindowsService.Installer.msi" - "PackageFilesAs" = "3:2" - "PackageFileSize" = "3:-2147483648" - "CabType" = "3:1" - "Compression" = "3:2" - "SignOutput" = "11:FALSE" - "CertificateFile" = "8:" - "PrivateKeyFile" = "8:" - "TimeStampServer" = "8:" - "InstallerBootstrapper" = "3:2" - "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" - { - "Enabled" = "11:TRUE" - "PromptEnabled" = "11:TRUE" - "PrerequisitesLocation" = "2:1" - "Url" = "8:" - "ComponentsUrl" = "8:" - "Items" - { - "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.NetCore.CoreRuntime.6.0.x64" - { - "Name" = "8:.NET Runtime 6.0.2 (x64)" - "ProductCode" = "8:Microsoft.NetCore.CoreRuntime.6.0.x64" - } - } - } - } - } - "Deployable" - { - "CustomAction" - { - "{4AA51A2D-7D85-4A59-BA75-B0809FC8B380}:_5F1DA6B181A44BBFAACC898CF10F1D27" - { - "Name" = "8:Publish Items from App.WindowsService (Active)" - "Condition" = "8:" - "Object" = "8:_A7730A47EAAB4F7F81E968F30D8EBB3A" - "FileType" = "3:2" - "InstallAction" = "3:1" - "Arguments" = "8:/Install" - "EntryPoint" = "8:" - "Sequence" = "3:1" - "Identifier" = "8:_E2504A23_55EC_4CB7_84DD_2B530A2751D0" - "InstallerClass" = "11:FALSE" - "CustomActionData" = "8:" - "Run64Bit" = "11:TRUE" - } - "{4AA51A2D-7D85-4A59-BA75-B0809FC8B380}:_9EBE3C84CB5B4C658A410ABC1464B8C0" - { - "Name" = "8:Publish Items from App.WindowsService (Active)" - "Condition" = "8:" - "Object" = "8:_A7730A47EAAB4F7F81E968F30D8EBB3A" - "FileType" = "3:2" - "InstallAction" = "3:4" - "Arguments" = "8:/Uninstall" - "EntryPoint" = "8:" - "Sequence" = "3:1" - "Identifier" = "8:_59E3CFE4_0AD2_4B86_8696_570FA6927F84" - "InstallerClass" = "11:FALSE" - "CustomActionData" = "8:" - "Run64Bit" = "11:TRUE" - } - } - "DefaultFeature" - { - "Name" = "8:DefaultFeature" - "Title" = "8:" - "Description" = "8:" - } - "ExternalPersistence" - { - "LaunchCondition" - { - "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_DD14B44BA87F401B80B6A5B086C67934" - { - "Name" = "8:.NET Core" - "Message" = "8:[VSDNETCOREMSG]" - "AllowLaterVersions" = "11:FALSE" - "InstallUrl" = "8:https://dotnet.microsoft.com/download/dotnet-core/[NetCoreVerMajorDotMinor]" - "IsNETCore" = "11:TRUE" - "Architecture" = "2:0" - "Runtime" = "2:0" - } - } - } - "File" - { - } - "FileType" - { - } - "Folder" - { - "{1525181F-901A-416C-8A58-119130FE478E}:_51B81562BA1C4DC9BAFA8B85FB99FE49" - { - "Name" = "8:#1916" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:DesktopFolder" - "Folders" - { - } - } - "{3C67513D-01DD-4637-8A68-80971EB9504F}:_6A06B8D5AD394233B314F92E5CEC0E55" - { - "DefaultLocation" = "8:[ProgramFiles64Folder][Manufacturer]\\[ProductName]" - "Name" = "8:#1925" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:TARGETDIR" - "Folders" - { - } - } - "{1525181F-901A-416C-8A58-119130FE478E}:_A55AB06105E246428F4A16405FF4A680" - { - "Name" = "8:#1919" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:ProgramMenuFolder" - "Folders" - { - } - } - } - "LaunchCondition" - { - } - "Locator" - { - } - "MsiBootstrapper" - { - "LangId" = "3:1033" - "RequiresElevation" = "11:FALSE" - } - "Product" - { - "Name" = "8:Microsoft Visual Studio" - "ProductName" = "8:.NET Jokes Service" - "ProductCode" = "8:{51AF8011-FE0C-4A25-8294-70274297A94A}" - "PackageCode" = "8:{8F9A8BD0-6012-4232-8848-1A1A769F6210}" - "UpgradeCode" = "8:{73CE04AC-216A-48B5-87FF-9F2DA4DD240F}" - "AspNetVersion" = "8:4.0.30319.0" - "RestartWWWService" = "11:FALSE" - "RemovePreviousVersions" = "11:TRUE" - "DetectNewerInstalledVersion" = "11:TRUE" - "InstallAllUsers" = "11:TRUE" - "ProductVersion" = "8:1.0.0" - "Manufacturer" = "8:Microsoft" - "ARPHELPTELEPHONE" = "8:" - "ARPHELPLINK" = "8:" - "Title" = "8:.NET Jokes Service Installer" - "Subject" = "8:" - "ARPCONTACT" = "8:Microsoft" - "Keywords" = "8:" - "ARPCOMMENTS" = "8:" - "ARPURLINFOABOUT" = "8:" - "ARPPRODUCTICON" = "8:" - "ARPIconIndex" = "3:0" - "SearchPath" = "8:" - "UseSystemSearchPath" = "11:TRUE" - "TargetPlatform" = "3:1" - "PreBuildEvent" = "8:" - "PostBuildEvent" = "8:" - "RunPostBuildEvent" = "3:0" - } - "Registry" - { - "HKLM" - { - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_37FE0F4D412B4496A7D2954033D459C1" - { - "Name" = "8:Software" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_FE229BE08F334FC5BE4BF6385B2F38DF" - { - "Name" = "8:[Manufacturer]" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - } - "Values" - { - } - } - } - "Values" - { - } - } - } - } - "HKCU" - { - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_28216245372F4B7FA7E4832A28BF15FE" - { - "Name" = "8:Software" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_EA48B6D3A1504AB08AA0FD4A8C9DAACA" - { - "Name" = "8:[Manufacturer]" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - } - "Values" - { - } - } - } - "Values" - { - } - } - } - } - "HKCR" - { - "Keys" - { - } - } - "HKU" - { - "Keys" - { - } - } - "HKPU" - { - "Keys" - { - } - } - } - "Sequences" - { - } - "Shortcut" - { - } - "UserInterface" - { - "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_027FBCB7D69344E69EBBB183478B1012" - { - "UseDynamicProperties" = "11:FALSE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdUserInterface.wim" - } - "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_1C8FF69E15C04C01880E2ACE83FC0960" - { - "UseDynamicProperties" = "11:FALSE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdBasicDialogs.wim" - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_4D4940449CCA40039721D1F443784033" - { - "Name" = "8:#1900" - "Sequence" = "3:1" - "Attributes" = "3:1" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_6340955AB6474AD8A60ED9A2F8687D15" - { - "Sequence" = "3:200" - "DisplayName" = "8:Installation Folder" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdFolderDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - "InstallAllUsersVisible" - { - "Name" = "8:InstallAllUsersVisible" - "DisplayName" = "8:#1059" - "Description" = "8:#1159" - "Type" = "3:5" - "ContextData" = "8:1;True=1;False=0" - "Attributes" = "3:0" - "Setting" = "3:0" - "Value" = "3:1" - "DefaultValue" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_7CCF0A595D1F4C218618FF215FFF0F81" - { - "Sequence" = "3:300" - "DisplayName" = "8:Confirm Installation" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdConfirmDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_9A74617A3FC04A0CB3273798E37009B0" - { - "Sequence" = "3:100" - "DisplayName" = "8:Welcome" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdWelcomeDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - "CopyrightWarning" - { - "Name" = "8:CopyrightWarning" - "DisplayName" = "8:#1002" - "Description" = "8:#1102" - "Type" = "3:3" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1202" - "DefaultValue" = "8:#1202" - "UsePlugInResources" = "11:TRUE" - } - "Welcome" - { - "Name" = "8:Welcome" - "DisplayName" = "8:#1003" - "Description" = "8:#1103" - "Type" = "3:3" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1203" - "DefaultValue" = "8:#1203" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_55BA805873C84519BDC354B0874DD7A1" - { - "Name" = "8:#1902" - "Sequence" = "3:2" - "Attributes" = "3:3" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_32B70D36C5DD430C95E4C3AF44B141CD" - { - "Sequence" = "3:100" - "DisplayName" = "8:Finished" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminFinishedDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_62120CF6981340308A6A634B108487EB" - { - "Name" = "8:#1901" - "Sequence" = "3:1" - "Attributes" = "3:2" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_D640B865F42A4DE1BA76D4B91D9198E6" - { - "Sequence" = "3:100" - "DisplayName" = "8:Progress" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdProgressDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - "ShowProgress" - { - "Name" = "8:ShowProgress" - "DisplayName" = "8:#1009" - "Description" = "8:#1109" - "Type" = "3:5" - "ContextData" = "8:1;True=1;False=0" - "Attributes" = "3:0" - "Setting" = "3:0" - "Value" = "3:1" - "DefaultValue" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_742C433E3C6C4D3FA0FF82150AAF048F" - { - "Name" = "8:#1901" - "Sequence" = "3:2" - "Attributes" = "3:2" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_39EDA672EF9944C9A85CEFDF9026EA79" - { - "Sequence" = "3:100" - "DisplayName" = "8:Progress" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminProgressDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - "ShowProgress" - { - "Name" = "8:ShowProgress" - "DisplayName" = "8:#1009" - "Description" = "8:#1109" - "Type" = "3:5" - "ContextData" = "8:1;True=1;False=0" - "Attributes" = "3:0" - "Setting" = "3:0" - "Value" = "3:1" - "DefaultValue" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_9EF6DBD8E7E34574A2C73DE6228A5977" - { - "Name" = "8:#1900" - "Sequence" = "3:2" - "Attributes" = "3:1" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_0606D6FC077E4B8FBD2DCBB325CC2771" - { - "Sequence" = "3:200" - "DisplayName" = "8:Installation Folder" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminFolderDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_7EF686FFE6F1435F873C7EF5AED85A7E" - { - "Sequence" = "3:100" - "DisplayName" = "8:Welcome" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminWelcomeDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - "CopyrightWarning" - { - "Name" = "8:CopyrightWarning" - "DisplayName" = "8:#1002" - "Description" = "8:#1102" - "Type" = "3:3" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1202" - "DefaultValue" = "8:#1202" - "UsePlugInResources" = "11:TRUE" - } - "Welcome" - { - "Name" = "8:Welcome" - "DisplayName" = "8:#1003" - "Description" = "8:#1103" - "Type" = "3:3" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1203" - "DefaultValue" = "8:#1203" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_D9F9C55D206542B5BE2B857FB526F247" - { - "Sequence" = "3:300" - "DisplayName" = "8:Confirm Installation" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminConfirmDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_B284E743AFA64F978E87A863B87CE746" - { - "Name" = "8:#1902" - "Sequence" = "3:1" - "Attributes" = "3:3" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_4A739649BBDB43C0ACE26B34075AC63E" - { - "Sequence" = "3:100" - "DisplayName" = "8:Finished" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdFinishedDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - "UpdateText" - { - "Name" = "8:UpdateText" - "DisplayName" = "8:#1058" - "Description" = "8:#1158" - "Type" = "3:15" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1258" - "DefaultValue" = "8:#1258" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - } - "MergeModule" - { - } - "ProjectOutput" - { - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_A7730A47EAAB4F7F81E968F30D8EBB3A" - { - "SourcePath" = "8:..\\..\\windows-service\\bin\\Release\\net6.0\\win-x64\\publish\\App.WindowsService.exe" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_6A06B8D5AD394233B314F92E5CEC0E55" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:PublishItems" - "OutputProjectGuid" = "8:{0642A687-220B-4E1E-99B8-A31B5DC40A35}" - "ShowKeyOutput" = "11:TRUE" - "PublishProfilePath" = "8:Properties\\PublishProfiles\\FolderProfile.pubxml" - "ExcludeFilters" - { - } - } - } - } -} diff --git a/docs/core/extensions/snippets/workers/6.0/windows-service-setup/App.WindowsService.Setup/Package.wxs b/docs/core/extensions/snippets/workers/6.0/windows-service-setup/App.WindowsService.Setup/Package.wxs deleted file mode 100644 index dbd2cf59cc701..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/windows-service-setup/App.WindowsService.Setup/Package.wxs +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/core/extensions/snippets/workers/6.0/windows-service/App.WindowsService.csproj b/docs/core/extensions/snippets/workers/6.0/windows-service/App.WindowsService.csproj deleted file mode 100644 index 731c17a9efefd..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/windows-service/App.WindowsService.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - net6.0-windows - enable - true - App.WindowsService - exe - true - win-x64 - x64 - - - - - - - diff --git a/docs/core/extensions/snippets/workers/6.0/windows-service/Program.cs b/docs/core/extensions/snippets/workers/6.0/windows-service/Program.cs deleted file mode 100644 index 176a73cd42152..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/windows-service/Program.cs +++ /dev/null @@ -1,20 +0,0 @@ -using App.WindowsService; -using Microsoft.Extensions.Logging.Configuration; -using Microsoft.Extensions.Logging.EventLog; - -IHostBuilder builder = Host.CreateDefaultBuilder(args) - .UseWindowsService(options => - { - options.ServiceName = ".NET Joke Service"; - }) - .ConfigureServices((context, services) => - { - LoggerProviderOptions.RegisterProviderOptions< - EventLogSettings, EventLogLoggerProvider>(services); - - services.AddSingleton(); - services.AddHostedService(); - }); - -IHost host = builder.Build(); -host.Run(); diff --git a/docs/core/extensions/snippets/workers/6.0/windows-service/WindowsBackgroundService.cs b/docs/core/extensions/snippets/workers/6.0/windows-service/WindowsBackgroundService.cs deleted file mode 100644 index e2f2e9722e798..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/windows-service/WindowsBackgroundService.cs +++ /dev/null @@ -1,45 +0,0 @@ -namespace App.WindowsService; - -public sealed class WindowsBackgroundService : BackgroundService -{ - private readonly JokeService _jokeService; - private readonly ILogger _logger; - - public WindowsBackgroundService( - JokeService jokeService, - ILogger logger) => - (_jokeService, _logger) = (jokeService, logger); - - 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); - } - } -} diff --git a/docs/core/extensions/snippets/workers/6.0/workers (.NET 6.0).sln b/docs/core/extensions/snippets/workers/6.0/workers (.NET 6.0).sln deleted file mode 100644 index 6067160bff470..0000000000000 --- a/docs/core/extensions/snippets/workers/6.0/workers (.NET 6.0).sln +++ /dev/null @@ -1,151 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.2.32630.192 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App.WorkerService", "background-service\App.WorkerService.csproj", "{51530BFA-E250-468A-BC9F-215222BB5CB5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App.QueueService", "queue-service\App.QueueService.csproj", "{BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App.ScopedService", "scoped-service\App.ScopedService.csproj", "{BA9F54FA-12C7-4A2A-B128-10BC2C079728}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App.TimerHostedService", "timer-service\App.TimerHostedService.csproj", "{70D6B8C4-BDE0-4231-94F1-7B403B640647}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App.WindowsService", "windows-service\App.WindowsService.csproj", "{0642A687-220B-4E1E-99B8-A31B5DC40A35}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App.CloudService", "cloud-service\App.CloudService.csproj", "{D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App.SignalCompletionService", "signal-completion-service\App.SignalCompletionService\App.SignalCompletionService.csproj", "{28F3041E-09D9-43D5-9D69-7BAE9BBA2531}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|ARM64 = Debug|ARM64 - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|ARM64 = Release|ARM64 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Debug|ARM64.Build.0 = Debug|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Debug|x64.ActiveCfg = Debug|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Debug|x64.Build.0 = Debug|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Debug|x86.ActiveCfg = Debug|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Debug|x86.Build.0 = Debug|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Release|Any CPU.Build.0 = Release|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Release|ARM64.ActiveCfg = Release|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Release|ARM64.Build.0 = Release|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Release|x64.ActiveCfg = Release|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Release|x64.Build.0 = Release|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Release|x86.ActiveCfg = Release|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Release|x86.Build.0 = Release|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Debug|ARM64.Build.0 = Debug|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Debug|x64.ActiveCfg = Debug|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Debug|x64.Build.0 = Debug|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Debug|x86.ActiveCfg = Debug|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Debug|x86.Build.0 = Debug|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Release|Any CPU.Build.0 = Release|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Release|ARM64.ActiveCfg = Release|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Release|ARM64.Build.0 = Release|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Release|x64.ActiveCfg = Release|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Release|x64.Build.0 = Release|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Release|x86.ActiveCfg = Release|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Release|x86.Build.0 = Release|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Debug|ARM64.Build.0 = Debug|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Debug|x64.ActiveCfg = Debug|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Debug|x64.Build.0 = Debug|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Debug|x86.ActiveCfg = Debug|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Debug|x86.Build.0 = Debug|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Release|Any CPU.Build.0 = Release|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Release|ARM64.ActiveCfg = Release|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Release|ARM64.Build.0 = Release|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Release|x64.ActiveCfg = Release|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Release|x64.Build.0 = Release|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Release|x86.ActiveCfg = Release|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Release|x86.Build.0 = Release|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Debug|Any CPU.Build.0 = Debug|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Debug|ARM64.Build.0 = Debug|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Debug|x64.ActiveCfg = Debug|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Debug|x64.Build.0 = Debug|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Debug|x86.ActiveCfg = Debug|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Debug|x86.Build.0 = Debug|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Release|Any CPU.ActiveCfg = Release|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Release|Any CPU.Build.0 = Release|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Release|ARM64.ActiveCfg = Release|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Release|ARM64.Build.0 = Release|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Release|x64.ActiveCfg = Release|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Release|x64.Build.0 = Release|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Release|x86.ActiveCfg = Release|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Release|x86.Build.0 = Release|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Debug|ARM64.Build.0 = Debug|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Debug|x64.ActiveCfg = Debug|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Debug|x64.Build.0 = Debug|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Debug|x86.ActiveCfg = Debug|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Debug|x86.Build.0 = Debug|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Release|Any CPU.Build.0 = Release|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Release|ARM64.ActiveCfg = Release|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Release|ARM64.Build.0 = Release|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Release|x64.ActiveCfg = Release|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Release|x64.Build.0 = Release|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Release|x86.ActiveCfg = Release|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Release|x86.Build.0 = Release|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Debug|ARM64.Build.0 = Debug|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Debug|x64.ActiveCfg = Debug|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Debug|x64.Build.0 = Debug|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Debug|x86.ActiveCfg = Debug|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Debug|x86.Build.0 = Debug|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Release|Any CPU.Build.0 = Release|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Release|ARM64.ActiveCfg = Release|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Release|ARM64.Build.0 = Release|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Release|x64.ActiveCfg = Release|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Release|x64.Build.0 = Release|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Release|x86.ActiveCfg = Release|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Release|x86.Build.0 = Release|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Debug|Any CPU.Build.0 = Debug|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Debug|ARM64.Build.0 = Debug|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Debug|x64.ActiveCfg = Debug|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Debug|x64.Build.0 = Debug|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Debug|x86.ActiveCfg = Debug|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Debug|x86.Build.0 = Debug|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Release|Any CPU.ActiveCfg = Release|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Release|Any CPU.Build.0 = Release|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Release|ARM64.ActiveCfg = Release|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Release|ARM64.Build.0 = Release|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Release|x64.ActiveCfg = Release|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Release|x64.Build.0 = Release|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Release|x86.ActiveCfg = Release|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {E9D03BDE-225F-4A4B-8441-8551EE03BD08} - EndGlobalSection -EndGlobal diff --git a/docs/core/extensions/snippets/workers/7.0/.dockerignore b/docs/core/extensions/snippets/workers/7.0/.dockerignore deleted file mode 100644 index 0426a8a3195ca..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/.dockerignore +++ /dev/null @@ -1,25 +0,0 @@ -**/.classpath -**/.dockerignore -**/.env -**/.git -**/.gitignore -**/.project -**/.settings -**/.toolstarget -**/.vs -**/.vscode -**/*.*proj.user -**/*.dbmdl -**/*.jfm -**/azds.yaml -**/bin -**/charts -**/docker-compose* -**/compose* -**/Dockerfile* -**/node_modules -**/npm-debug.log -**/obj -**/secrets.dev.yaml -**/values.dev.yaml -README.md diff --git a/docs/core/extensions/snippets/workers/7.0/background-service/Properties/launchSettings.json b/docs/core/extensions/snippets/workers/7.0/background-service/Properties/launchSettings.json deleted file mode 100644 index 1e14e1408ff21..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/background-service/Properties/launchSettings.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "profiles": { - "App.WorkerService": { - "commandName": "Project", - "environmentVariables": { - "DOTNET_ENVIRONMENT": "Development" - }, - "dotnetRunMessages": "true" - }, - "Docker": { - "commandName": "Docker" - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/background-service/Worker.cs b/docs/core/extensions/snippets/workers/7.0/background-service/Worker.cs deleted file mode 100644 index e7c658599116a..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/background-service/Worker.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace App.WorkerService; - -public sealed class Worker : BackgroundService -{ - private readonly ILogger _logger; - - public Worker(ILogger logger) - { - _logger = logger; - } - - protected override async Task ExecuteAsync(CancellationToken stoppingToken) - { - while (!stoppingToken.IsCancellationRequested) - { - _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); - await Task.Delay(1_000, stoppingToken); - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/background-service/appsettings.Development.json b/docs/core/extensions/snippets/workers/7.0/background-service/appsettings.Development.json deleted file mode 100644 index 8983e0fc1c5e2..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/background-service/appsettings.Development.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/background-service/appsettings.json b/docs/core/extensions/snippets/workers/7.0/background-service/appsettings.json deleted file mode 100644 index 8983e0fc1c5e2..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/background-service/appsettings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/cloud-service/.dockerignore b/docs/core/extensions/snippets/workers/7.0/cloud-service/.dockerignore deleted file mode 100644 index 0426a8a3195ca..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/cloud-service/.dockerignore +++ /dev/null @@ -1,25 +0,0 @@ -**/.classpath -**/.dockerignore -**/.env -**/.git -**/.gitignore -**/.project -**/.settings -**/.toolstarget -**/.vs -**/.vscode -**/*.*proj.user -**/*.dbmdl -**/*.jfm -**/azds.yaml -**/bin -**/charts -**/docker-compose* -**/compose* -**/Dockerfile* -**/node_modules -**/npm-debug.log -**/obj -**/secrets.dev.yaml -**/values.dev.yaml -README.md diff --git a/docs/core/extensions/snippets/workers/7.0/cloud-service/App.CloudService.csproj b/docs/core/extensions/snippets/workers/7.0/cloud-service/App.CloudService.csproj deleted file mode 100644 index b069310a006cf..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/cloud-service/App.CloudService.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - net7.0 - enable - true - App.CloudService - Linux - - - - - - diff --git a/docs/core/extensions/snippets/workers/7.0/cloud-service/Dockerfile b/docs/core/extensions/snippets/workers/7.0/cloud-service/Dockerfile deleted file mode 100644 index 8890a2fa25bc7..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/cloud-service/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM mcr.microsoft.com/dotnet/runtime:7.0 AS base -WORKDIR /app - -# Creates a non-root user with an explicit UID and adds permission to access the /app folder -# For more info, please refer to https://aka.ms/vscode-docker-dotnet-configure-containers -RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app -USER appuser - -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build -WORKDIR /src -COPY ["App.CloudService.csproj", "./"] -RUN dotnet restore "App.CloudService.csproj" -COPY . . -WORKDIR "/src/." -RUN dotnet build "App.CloudService.csproj" -c Release -o /app/build - -FROM build AS publish -RUN dotnet publish "App.CloudService.csproj" -c Release -o /app/publish - -FROM base AS final -WORKDIR /app -COPY --from=publish /app/publish . -ENTRYPOINT ["dotnet", "App.CloudService.dll"] diff --git a/docs/core/extensions/snippets/workers/7.0/cloud-service/Properties/launchSettings.json b/docs/core/extensions/snippets/workers/7.0/cloud-service/Properties/launchSettings.json deleted file mode 100644 index d1947de1b0a5c..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/cloud-service/Properties/launchSettings.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "profiles": { - "App.CloudService": { - "commandName": "Project", - "environmentVariables": { - "DOTNET_ENVIRONMENT": "Development" - }, - "dotnetRunMessages": "true" - }, - "Docker": { - "commandName": "Docker" - } - } -} \ No newline at end of file diff --git a/docs/core/extensions/snippets/workers/7.0/cloud-service/Worker.cs b/docs/core/extensions/snippets/workers/7.0/cloud-service/Worker.cs deleted file mode 100644 index e7650e9396d7c..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/cloud-service/Worker.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace App.CloudService; - -public sealed class Worker : BackgroundService -{ - private readonly ILogger _logger; - - public Worker(ILogger logger) - { - _logger = logger; - } - - protected override async Task ExecuteAsync(CancellationToken stoppingToken) - { - while (!stoppingToken.IsCancellationRequested) - { - _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); - try - { - await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken); - } - catch (OperationCanceledException) - { - break; - } - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/cloud-service/appsettings.Development.json b/docs/core/extensions/snippets/workers/7.0/cloud-service/appsettings.Development.json deleted file mode 100644 index 8983e0fc1c5e2..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/cloud-service/appsettings.Development.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/cloud-service/appsettings.json b/docs/core/extensions/snippets/workers/7.0/cloud-service/appsettings.json deleted file mode 100644 index 8983e0fc1c5e2..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/cloud-service/appsettings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/queue-service/App.QueueService.csproj b/docs/core/extensions/snippets/workers/7.0/queue-service/App.QueueService.csproj deleted file mode 100644 index b961eef65a44d..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/queue-service/App.QueueService.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - net7.0 - enable - true - App.QueueService - - - - - - diff --git a/docs/core/extensions/snippets/workers/7.0/queue-service/DefaultBackgroundTaskQueue.cs b/docs/core/extensions/snippets/workers/7.0/queue-service/DefaultBackgroundTaskQueue.cs deleted file mode 100644 index c00e602a35238..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/queue-service/DefaultBackgroundTaskQueue.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Threading.Channels; - -namespace App.QueueService; - -public sealed class DefaultBackgroundTaskQueue : IBackgroundTaskQueue -{ - private readonly Channel> _queue; - - public DefaultBackgroundTaskQueue(int capacity) - { - BoundedChannelOptions options = new(capacity) - { - FullMode = BoundedChannelFullMode.Wait - }; - _queue = Channel.CreateBounded>(options); - } - - public async ValueTask QueueBackgroundWorkItemAsync( - Func workItem) - { - if (workItem is null) - { - throw new ArgumentNullException(nameof(workItem)); - } - - await _queue.Writer.WriteAsync(workItem); - } - - public async ValueTask> DequeueAsync( - CancellationToken cancellationToken) - { - Func? workItem = - await _queue.Reader.ReadAsync(cancellationToken); - - return workItem; - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/queue-service/IBackgroundTaskQueue.cs b/docs/core/extensions/snippets/workers/7.0/queue-service/IBackgroundTaskQueue.cs deleted file mode 100644 index f215d22edf836..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/queue-service/IBackgroundTaskQueue.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace App.QueueService; - -public interface IBackgroundTaskQueue -{ - ValueTask QueueBackgroundWorkItemAsync( - Func workItem); - - ValueTask> DequeueAsync( - CancellationToken cancellationToken); -} diff --git a/docs/core/extensions/snippets/workers/7.0/queue-service/Properties/launchSettings.json b/docs/core/extensions/snippets/workers/7.0/queue-service/Properties/launchSettings.json deleted file mode 100644 index be1cadc9740e6..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/queue-service/Properties/launchSettings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "profiles": { - "App.QueueService": { - "commandName": "Project", - "environmentVariables": { - "DOTNET_ENVIRONMENT": "Development" - }, - "dotnetRunMessages": "true" - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/queue-service/appsettings.Development.json b/docs/core/extensions/snippets/workers/7.0/queue-service/appsettings.Development.json deleted file mode 100644 index 8983e0fc1c5e2..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/queue-service/appsettings.Development.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/queue-service/appsettings.json b/docs/core/extensions/snippets/workers/7.0/queue-service/appsettings.json deleted file mode 100644 index 8983e0fc1c5e2..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/queue-service/appsettings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/scoped-service/App.ScopedService.csproj b/docs/core/extensions/snippets/workers/7.0/scoped-service/App.ScopedService.csproj deleted file mode 100644 index 604afedb90180..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/scoped-service/App.ScopedService.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - net7.0 - enable - true - App.ScopedService - - - - - - diff --git a/docs/core/extensions/snippets/workers/7.0/scoped-service/IScopedProcessingService.cs b/docs/core/extensions/snippets/workers/7.0/scoped-service/IScopedProcessingService.cs deleted file mode 100644 index 9c5a319a5038e..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/scoped-service/IScopedProcessingService.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace App.ScopedService; - -public interface IScopedProcessingService -{ - Task DoWorkAsync(CancellationToken stoppingToken); -} diff --git a/docs/core/extensions/snippets/workers/7.0/scoped-service/Properties/launchSettings.json b/docs/core/extensions/snippets/workers/7.0/scoped-service/Properties/launchSettings.json deleted file mode 100644 index 2e95be32ec382..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/scoped-service/Properties/launchSettings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "profiles": { - "App.ScopedService": { - "commandName": "Project", - "environmentVariables": { - "DOTNET_ENVIRONMENT": "Development" - }, - "dotnetRunMessages": "true" - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/scoped-service/ScopedBackgroundService.cs b/docs/core/extensions/snippets/workers/7.0/scoped-service/ScopedBackgroundService.cs deleted file mode 100644 index fc0c6716ddd8f..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/scoped-service/ScopedBackgroundService.cs +++ /dev/null @@ -1,42 +0,0 @@ -namespace App.ScopedService; - -public sealed class ScopedBackgroundService : BackgroundService -{ - private readonly IServiceProvider _serviceProvider; - private readonly ILogger _logger; - - public ScopedBackgroundService( - IServiceProvider serviceProvider, - ILogger logger) => - (_serviceProvider, _logger) = (serviceProvider, logger); - - protected override async Task ExecuteAsync(CancellationToken stoppingToken) - { - _logger.LogInformation( - $"{nameof(ScopedBackgroundService)} is running."); - - await DoWorkAsync(stoppingToken); - } - - private async Task DoWorkAsync(CancellationToken stoppingToken) - { - _logger.LogInformation( - $"{nameof(ScopedBackgroundService)} is working."); - - using (IServiceScope scope = _serviceProvider.CreateScope()) - { - IScopedProcessingService scopedProcessingService = - scope.ServiceProvider.GetRequiredService(); - - await scopedProcessingService.DoWorkAsync(stoppingToken); - } - } - - public override async Task StopAsync(CancellationToken stoppingToken) - { - _logger.LogInformation( - $"{nameof(ScopedBackgroundService)} is stopping."); - - await base.StopAsync(stoppingToken); - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/scoped-service/appsettings.Development.json b/docs/core/extensions/snippets/workers/7.0/scoped-service/appsettings.Development.json deleted file mode 100644 index 8983e0fc1c5e2..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/scoped-service/appsettings.Development.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/scoped-service/appsettings.json b/docs/core/extensions/snippets/workers/7.0/scoped-service/appsettings.json deleted file mode 100644 index 8983e0fc1c5e2..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/scoped-service/appsettings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/Properties/launchSettings.json b/docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/Properties/launchSettings.json deleted file mode 100644 index 8695110dae028..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/Properties/launchSettings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "profiles": { - "App.SignalCompletionService": { - "commandName": "Project", - "dotnetRunMessages": true, - "environmentVariables": { - "DOTNET_ENVIRONMENT": "Development" - } - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/Worker.cs b/docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/Worker.cs deleted file mode 100644 index 2edf4773b8506..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/Worker.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace App.SignalCompletionService; - -public sealed class Worker : BackgroundService -{ - private readonly IHostApplicationLifetime _hostApplicationLifetime; - private readonly ILogger _logger; - - public Worker( - IHostApplicationLifetime hostApplicationLifetime, ILogger logger) => - (_hostApplicationLifetime, _logger) = (hostApplicationLifetime, logger); - - protected override async Task ExecuteAsync(CancellationToken stoppingToken) - { - // TODO: implement single execution logic here. - _logger.LogInformation( - "Worker running at: {time}", DateTimeOffset.Now); - - await Task.Delay(1000, stoppingToken); - - // When completed, the entire app host will stop. - _hostApplicationLifetime.StopApplication(); - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/appsettings.Development.json b/docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/appsettings.Development.json deleted file mode 100644 index b2dcdb67421cd..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/appsettings.Development.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.Hosting.Lifetime": "Information" - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/appsettings.json b/docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/appsettings.json deleted file mode 100644 index b2dcdb67421cd..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/appsettings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.Hosting.Lifetime": "Information" - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/timer-service/Properties/launchSettings.json b/docs/core/extensions/snippets/workers/7.0/timer-service/Properties/launchSettings.json deleted file mode 100644 index 6e17df44a38bf..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/timer-service/Properties/launchSettings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "profiles": { - "App.TimerHostedService": { - "commandName": "Project", - "environmentVariables": { - "DOTNET_ENVIRONMENT": "Development" - }, - "dotnetRunMessages": "true" - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/timer-service/appsettings.Development.json b/docs/core/extensions/snippets/workers/7.0/timer-service/appsettings.Development.json deleted file mode 100644 index 8983e0fc1c5e2..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/timer-service/appsettings.Development.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/timer-service/appsettings.json b/docs/core/extensions/snippets/workers/7.0/timer-service/appsettings.json deleted file mode 100644 index 8983e0fc1c5e2..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/timer-service/appsettings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/windows-service-setup/App.WindowsService.Setup/App.WindowsService.Setup.wixproj b/docs/core/extensions/snippets/workers/7.0/windows-service-setup/App.WindowsService.Setup/App.WindowsService.Setup.wixproj deleted file mode 100644 index 1c7aaee308319..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/windows-service-setup/App.WindowsService.Setup/App.WindowsService.Setup.wixproj +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/docs/core/extensions/snippets/workers/7.0/windows-service/JokeService.cs b/docs/core/extensions/snippets/workers/7.0/windows-service/JokeService.cs deleted file mode 100644 index ab66c5d5fbec7..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/windows-service/JokeService.cs +++ /dev/null @@ -1,43 +0,0 @@ -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 _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); diff --git a/docs/core/extensions/snippets/workers/7.0/windows-service/Properties/PublishProfiles/FolderProfile.pubxml b/docs/core/extensions/snippets/workers/7.0/windows-service/Properties/PublishProfiles/FolderProfile.pubxml deleted file mode 100644 index 6a7a206fc3e00..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/windows-service/Properties/PublishProfiles/FolderProfile.pubxml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - Release - Any CPU - bin\Release\net7.0-windows\win-x64\publish\ - FileSystem - net7.0-windows - win-x64 - true - true - true - true - - \ No newline at end of file diff --git a/docs/core/extensions/snippets/workers/7.0/windows-service/Properties/launchSettings.json b/docs/core/extensions/snippets/workers/7.0/windows-service/Properties/launchSettings.json deleted file mode 100644 index 9a42edc53d4d4..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/windows-service/Properties/launchSettings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "profiles": { - "App.WindowsService": { - "commandName": "Project", - "environmentVariables": { - "DOTNET_ENVIRONMENT": "Development" - }, - "dotnetRunMessages": "true" - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/windows-service/appsettings.Development.json b/docs/core/extensions/snippets/workers/7.0/windows-service/appsettings.Development.json deleted file mode 100644 index 9cb25d1eb44a5..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/windows-service/appsettings.Development.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Warning" - }, - "EventLog": { - "SourceName": "The Joke Service", - "LogName": "Application", - "LogLevel": { - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/windows-service/appsettings.json b/docs/core/extensions/snippets/workers/7.0/windows-service/appsettings.json deleted file mode 100644 index 9cb25d1eb44a5..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/windows-service/appsettings.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Warning" - }, - "EventLog": { - "SourceName": "The Joke Service", - "LogName": "Application", - "LogLevel": { - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - } - } -} diff --git a/docs/core/extensions/snippets/workers/7.0/workers (.NET 7.0).sln b/docs/core/extensions/snippets/workers/7.0/workers (.NET 7.0).sln deleted file mode 100644 index 6067160bff470..0000000000000 --- a/docs/core/extensions/snippets/workers/7.0/workers (.NET 7.0).sln +++ /dev/null @@ -1,151 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.2.32630.192 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App.WorkerService", "background-service\App.WorkerService.csproj", "{51530BFA-E250-468A-BC9F-215222BB5CB5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App.QueueService", "queue-service\App.QueueService.csproj", "{BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App.ScopedService", "scoped-service\App.ScopedService.csproj", "{BA9F54FA-12C7-4A2A-B128-10BC2C079728}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App.TimerHostedService", "timer-service\App.TimerHostedService.csproj", "{70D6B8C4-BDE0-4231-94F1-7B403B640647}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App.WindowsService", "windows-service\App.WindowsService.csproj", "{0642A687-220B-4E1E-99B8-A31B5DC40A35}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App.CloudService", "cloud-service\App.CloudService.csproj", "{D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App.SignalCompletionService", "signal-completion-service\App.SignalCompletionService\App.SignalCompletionService.csproj", "{28F3041E-09D9-43D5-9D69-7BAE9BBA2531}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|ARM64 = Debug|ARM64 - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|ARM64 = Release|ARM64 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Debug|ARM64.Build.0 = Debug|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Debug|x64.ActiveCfg = Debug|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Debug|x64.Build.0 = Debug|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Debug|x86.ActiveCfg = Debug|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Debug|x86.Build.0 = Debug|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Release|Any CPU.Build.0 = Release|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Release|ARM64.ActiveCfg = Release|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Release|ARM64.Build.0 = Release|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Release|x64.ActiveCfg = Release|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Release|x64.Build.0 = Release|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Release|x86.ActiveCfg = Release|Any CPU - {51530BFA-E250-468A-BC9F-215222BB5CB5}.Release|x86.Build.0 = Release|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Debug|ARM64.Build.0 = Debug|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Debug|x64.ActiveCfg = Debug|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Debug|x64.Build.0 = Debug|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Debug|x86.ActiveCfg = Debug|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Debug|x86.Build.0 = Debug|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Release|Any CPU.Build.0 = Release|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Release|ARM64.ActiveCfg = Release|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Release|ARM64.Build.0 = Release|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Release|x64.ActiveCfg = Release|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Release|x64.Build.0 = Release|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Release|x86.ActiveCfg = Release|Any CPU - {BEB98EBB-60C0-4BB1-A606-CECAAB6E7B6E}.Release|x86.Build.0 = Release|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Debug|ARM64.Build.0 = Debug|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Debug|x64.ActiveCfg = Debug|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Debug|x64.Build.0 = Debug|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Debug|x86.ActiveCfg = Debug|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Debug|x86.Build.0 = Debug|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Release|Any CPU.Build.0 = Release|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Release|ARM64.ActiveCfg = Release|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Release|ARM64.Build.0 = Release|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Release|x64.ActiveCfg = Release|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Release|x64.Build.0 = Release|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Release|x86.ActiveCfg = Release|Any CPU - {BA9F54FA-12C7-4A2A-B128-10BC2C079728}.Release|x86.Build.0 = Release|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Debug|Any CPU.Build.0 = Debug|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Debug|ARM64.Build.0 = Debug|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Debug|x64.ActiveCfg = Debug|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Debug|x64.Build.0 = Debug|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Debug|x86.ActiveCfg = Debug|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Debug|x86.Build.0 = Debug|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Release|Any CPU.ActiveCfg = Release|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Release|Any CPU.Build.0 = Release|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Release|ARM64.ActiveCfg = Release|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Release|ARM64.Build.0 = Release|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Release|x64.ActiveCfg = Release|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Release|x64.Build.0 = Release|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Release|x86.ActiveCfg = Release|Any CPU - {70D6B8C4-BDE0-4231-94F1-7B403B640647}.Release|x86.Build.0 = Release|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Debug|ARM64.Build.0 = Debug|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Debug|x64.ActiveCfg = Debug|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Debug|x64.Build.0 = Debug|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Debug|x86.ActiveCfg = Debug|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Debug|x86.Build.0 = Debug|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Release|Any CPU.Build.0 = Release|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Release|ARM64.ActiveCfg = Release|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Release|ARM64.Build.0 = Release|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Release|x64.ActiveCfg = Release|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Release|x64.Build.0 = Release|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Release|x86.ActiveCfg = Release|Any CPU - {0642A687-220B-4E1E-99B8-A31B5DC40A35}.Release|x86.Build.0 = Release|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Debug|ARM64.Build.0 = Debug|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Debug|x64.ActiveCfg = Debug|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Debug|x64.Build.0 = Debug|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Debug|x86.ActiveCfg = Debug|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Debug|x86.Build.0 = Debug|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Release|Any CPU.Build.0 = Release|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Release|ARM64.ActiveCfg = Release|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Release|ARM64.Build.0 = Release|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Release|x64.ActiveCfg = Release|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Release|x64.Build.0 = Release|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Release|x86.ActiveCfg = Release|Any CPU - {D27DBD6D-3E1D-4A3F-9653-5EBFABA22123}.Release|x86.Build.0 = Release|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Debug|Any CPU.Build.0 = Debug|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Debug|ARM64.Build.0 = Debug|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Debug|x64.ActiveCfg = Debug|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Debug|x64.Build.0 = Debug|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Debug|x86.ActiveCfg = Debug|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Debug|x86.Build.0 = Debug|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Release|Any CPU.ActiveCfg = Release|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Release|Any CPU.Build.0 = Release|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Release|ARM64.ActiveCfg = Release|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Release|ARM64.Build.0 = Release|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Release|x64.ActiveCfg = Release|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Release|x64.Build.0 = Release|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Release|x86.ActiveCfg = Release|Any CPU - {28F3041E-09D9-43D5-9D69-7BAE9BBA2531}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {E9D03BDE-225F-4A4B-8441-8551EE03BD08} - EndGlobalSection -EndGlobal diff --git a/docs/core/extensions/snippets/workers/7.0/background-service/App.WorkerService.csproj b/docs/core/extensions/snippets/workers/background-service/App.WorkerService.csproj similarity index 91% rename from docs/core/extensions/snippets/workers/7.0/background-service/App.WorkerService.csproj rename to docs/core/extensions/snippets/workers/background-service/App.WorkerService.csproj index d40d037c18710..96359edf21ef8 100644 --- a/docs/core/extensions/snippets/workers/7.0/background-service/App.WorkerService.csproj +++ b/docs/core/extensions/snippets/workers/background-service/App.WorkerService.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable true App.WorkerService diff --git a/docs/core/extensions/snippets/workers/7.0/background-service/Dockerfile b/docs/core/extensions/snippets/workers/background-service/Dockerfile similarity index 86% rename from docs/core/extensions/snippets/workers/7.0/background-service/Dockerfile rename to docs/core/extensions/snippets/workers/background-service/Dockerfile index 9d5176c0b3ac6..ccb925c3d1789 100644 --- a/docs/core/extensions/snippets/workers/7.0/background-service/Dockerfile +++ b/docs/core/extensions/snippets/workers/background-service/Dockerfile @@ -1,10 +1,10 @@ # 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:7.0 AS base +FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base WORKDIR /app -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src COPY ["background-service/App.WorkerService.csproj", "background-service/"] RUN dotnet restore "background-service/App.WorkerService.csproj" diff --git a/docs/core/extensions/snippets/workers/7.0/background-service/Program.cs b/docs/core/extensions/snippets/workers/background-service/Program.cs similarity index 100% rename from docs/core/extensions/snippets/workers/7.0/background-service/Program.cs rename to docs/core/extensions/snippets/workers/background-service/Program.cs diff --git a/docs/core/extensions/snippets/workers/6.0/background-service/Properties/launchSettings.json b/docs/core/extensions/snippets/workers/background-service/Properties/launchSettings.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/background-service/Properties/launchSettings.json rename to docs/core/extensions/snippets/workers/background-service/Properties/launchSettings.json diff --git a/docs/core/extensions/snippets/workers/background-service/Worker.cs b/docs/core/extensions/snippets/workers/background-service/Worker.cs new file mode 100644 index 0000000000000..f050398cf2ec0 --- /dev/null +++ b/docs/core/extensions/snippets/workers/background-service/Worker.cs @@ -0,0 +1,13 @@ +namespace App.WorkerService; + +public sealed class Worker(ILogger logger) : BackgroundService +{ + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + while (!stoppingToken.IsCancellationRequested) + { + logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); + await Task.Delay(1_000, stoppingToken); + } + } +} diff --git a/docs/core/extensions/snippets/workers/6.0/background-service/appsettings.Development.json b/docs/core/extensions/snippets/workers/background-service/appsettings.Development.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/background-service/appsettings.Development.json rename to docs/core/extensions/snippets/workers/background-service/appsettings.Development.json diff --git a/docs/core/extensions/snippets/workers/6.0/background-service/appsettings.json b/docs/core/extensions/snippets/workers/background-service/appsettings.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/background-service/appsettings.json rename to docs/core/extensions/snippets/workers/background-service/appsettings.json diff --git a/docs/core/extensions/snippets/workers/6.0/cloud-service/.dockerignore b/docs/core/extensions/snippets/workers/cloud-service/.dockerignore similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/cloud-service/.dockerignore rename to docs/core/extensions/snippets/workers/cloud-service/.dockerignore diff --git a/docs/core/extensions/snippets/workers/6.0/cloud-service/App.CloudService.csproj b/docs/core/extensions/snippets/workers/cloud-service/App.CloudService.csproj similarity index 91% rename from docs/core/extensions/snippets/workers/6.0/cloud-service/App.CloudService.csproj rename to docs/core/extensions/snippets/workers/cloud-service/App.CloudService.csproj index 70dc659e40b07..4e1bedc7faf1d 100644 --- a/docs/core/extensions/snippets/workers/6.0/cloud-service/App.CloudService.csproj +++ b/docs/core/extensions/snippets/workers/cloud-service/App.CloudService.csproj @@ -1,6 +1,6 @@ - net6.0 + net8.0 enable true App.CloudService diff --git a/docs/core/extensions/snippets/workers/6.0/cloud-service/Dockerfile b/docs/core/extensions/snippets/workers/cloud-service/Dockerfile similarity index 87% rename from docs/core/extensions/snippets/workers/6.0/cloud-service/Dockerfile rename to docs/core/extensions/snippets/workers/cloud-service/Dockerfile index 8890a2fa25bc7..1d15d4f499e2d 100644 --- a/docs/core/extensions/snippets/workers/6.0/cloud-service/Dockerfile +++ b/docs/core/extensions/snippets/workers/cloud-service/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/runtime:7.0 AS base +FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base WORKDIR /app # Creates a non-root user with an explicit UID and adds permission to access the /app folder @@ -6,7 +6,7 @@ WORKDIR /app RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app USER appuser -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src COPY ["App.CloudService.csproj", "./"] RUN dotnet restore "App.CloudService.csproj" diff --git a/docs/core/extensions/snippets/workers/7.0/cloud-service/Program.cs b/docs/core/extensions/snippets/workers/cloud-service/Program.cs similarity index 100% rename from docs/core/extensions/snippets/workers/7.0/cloud-service/Program.cs rename to docs/core/extensions/snippets/workers/cloud-service/Program.cs diff --git a/docs/core/extensions/snippets/workers/6.0/cloud-service/Properties/launchSettings.json b/docs/core/extensions/snippets/workers/cloud-service/Properties/launchSettings.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/cloud-service/Properties/launchSettings.json rename to docs/core/extensions/snippets/workers/cloud-service/Properties/launchSettings.json diff --git a/docs/core/extensions/snippets/workers/6.0/cloud-service/Worker.cs b/docs/core/extensions/snippets/workers/cloud-service/Worker.cs similarity index 61% rename from docs/core/extensions/snippets/workers/6.0/cloud-service/Worker.cs rename to docs/core/extensions/snippets/workers/cloud-service/Worker.cs index e7650e9396d7c..ee6b98ebb9d5f 100644 --- a/docs/core/extensions/snippets/workers/6.0/cloud-service/Worker.cs +++ b/docs/core/extensions/snippets/workers/cloud-service/Worker.cs @@ -1,19 +1,12 @@ namespace App.CloudService; -public sealed class Worker : BackgroundService +public sealed class Worker(ILogger logger) : BackgroundService { - private readonly ILogger _logger; - - public Worker(ILogger logger) - { - _logger = logger; - } - protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { - _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); + logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); try { await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken); diff --git a/docs/core/extensions/snippets/workers/6.0/cloud-service/appsettings.Development.json b/docs/core/extensions/snippets/workers/cloud-service/appsettings.Development.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/cloud-service/appsettings.Development.json rename to docs/core/extensions/snippets/workers/cloud-service/appsettings.Development.json diff --git a/docs/core/extensions/snippets/workers/6.0/cloud-service/appsettings.json b/docs/core/extensions/snippets/workers/cloud-service/appsettings.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/cloud-service/appsettings.json rename to docs/core/extensions/snippets/workers/cloud-service/appsettings.json diff --git a/docs/core/extensions/snippets/workers/6.0/queue-service/App.QueueService.csproj b/docs/core/extensions/snippets/workers/queue-service/App.QueueService.csproj similarity index 87% rename from docs/core/extensions/snippets/workers/6.0/queue-service/App.QueueService.csproj rename to docs/core/extensions/snippets/workers/queue-service/App.QueueService.csproj index d47b54d1af050..eea3897dfce45 100644 --- a/docs/core/extensions/snippets/workers/6.0/queue-service/App.QueueService.csproj +++ b/docs/core/extensions/snippets/workers/queue-service/App.QueueService.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 enable true App.QueueService diff --git a/docs/core/extensions/snippets/workers/6.0/queue-service/DefaultBackgroundTaskQueue.cs b/docs/core/extensions/snippets/workers/queue-service/DefaultBackgroundTaskQueue.cs similarity index 89% rename from docs/core/extensions/snippets/workers/6.0/queue-service/DefaultBackgroundTaskQueue.cs rename to docs/core/extensions/snippets/workers/queue-service/DefaultBackgroundTaskQueue.cs index c00e602a35238..81b4a860bb414 100644 --- a/docs/core/extensions/snippets/workers/6.0/queue-service/DefaultBackgroundTaskQueue.cs +++ b/docs/core/extensions/snippets/workers/queue-service/DefaultBackgroundTaskQueue.cs @@ -18,10 +18,7 @@ public DefaultBackgroundTaskQueue(int capacity) public async ValueTask QueueBackgroundWorkItemAsync( Func workItem) { - if (workItem is null) - { - throw new ArgumentNullException(nameof(workItem)); - } + ArgumentNullException.ThrowIfNull(workItem); await _queue.Writer.WriteAsync(workItem); } diff --git a/docs/core/extensions/snippets/workers/6.0/queue-service/IBackgroundTaskQueue.cs b/docs/core/extensions/snippets/workers/queue-service/IBackgroundTaskQueue.cs similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/queue-service/IBackgroundTaskQueue.cs rename to docs/core/extensions/snippets/workers/queue-service/IBackgroundTaskQueue.cs diff --git a/docs/core/extensions/snippets/workers/7.0/queue-service/MonitorLoop.cs b/docs/core/extensions/snippets/workers/queue-service/MonitorLoop.cs similarity index 51% rename from docs/core/extensions/snippets/workers/7.0/queue-service/MonitorLoop.cs rename to docs/core/extensions/snippets/workers/queue-service/MonitorLoop.cs index c369fbbbb7f3d..771f15f21af41 100644 --- a/docs/core/extensions/snippets/workers/7.0/queue-service/MonitorLoop.cs +++ b/docs/core/extensions/snippets/workers/queue-service/MonitorLoop.cs @@ -1,24 +1,15 @@ namespace App.QueueService; -public sealed class MonitorLoop +public sealed class MonitorLoop( + IBackgroundTaskQueue taskQueue, + ILogger logger, + IHostApplicationLifetime applicationLifetime) { - private readonly IBackgroundTaskQueue _taskQueue; - private readonly ILogger _logger; - private readonly CancellationToken _cancellationToken; - - public MonitorLoop( - IBackgroundTaskQueue taskQueue, - ILogger logger, - IHostApplicationLifetime applicationLifetime) - { - _taskQueue = taskQueue; - _logger = logger; - _cancellationToken = applicationLifetime.ApplicationStopping; - } + private readonly CancellationToken _cancellationToken = applicationLifetime.ApplicationStopping; public void StartMonitorLoop() { - _logger.LogInformation($"{nameof(MonitorAsync)} loop is starting."); + logger.LogInformation($"{nameof(MonitorAsync)} loop is starting."); // Run a console user input loop in a background thread Task.Run(async () => await MonitorAsync()); @@ -32,7 +23,7 @@ private async ValueTask MonitorAsync() if (keyStroke.Key == ConsoleKey.W) { // Enqueue a background work item - await _taskQueue.QueueBackgroundWorkItemAsync(BuildWorkItemAsync); + await taskQueue.QueueBackgroundWorkItemAsync(BuildWorkItemAsync); } } } @@ -45,7 +36,7 @@ private async ValueTask BuildWorkItemAsync(CancellationToken token) int delayLoop = 0; var guid = Guid.NewGuid(); - _logger.LogInformation("Queued work item {Guid} is starting.", guid); + logger.LogInformation("Queued work item {Guid} is starting.", guid); while (!token.IsCancellationRequested && delayLoop < 3) { @@ -60,15 +51,16 @@ private async ValueTask BuildWorkItemAsync(CancellationToken token) ++ delayLoop; - _logger.LogInformation("Queued work item {Guid} is running. {DelayLoop}/3", guid, delayLoop); + logger.LogInformation("Queued work item {Guid} is running. {DelayLoop}/3", guid, delayLoop); } - string format = delayLoop switch + if (delayLoop is 3) { - 3 => "Queued Background Task {Guid} is complete.", - _ => "Queued Background Task {Guid} was cancelled." - }; - - _logger.LogInformation(format, guid); + logger.LogInformation("Queued Background Task {Guid} is complete.", guid); + } + else + { + logger.LogInformation("Queued Background Task {Guid} was cancelled.", guid); + } } } diff --git a/docs/core/extensions/snippets/workers/7.0/queue-service/Program.cs b/docs/core/extensions/snippets/workers/queue-service/Program.cs similarity index 100% rename from docs/core/extensions/snippets/workers/7.0/queue-service/Program.cs rename to docs/core/extensions/snippets/workers/queue-service/Program.cs diff --git a/docs/core/extensions/snippets/workers/6.0/queue-service/Properties/launchSettings.json b/docs/core/extensions/snippets/workers/queue-service/Properties/launchSettings.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/queue-service/Properties/launchSettings.json rename to docs/core/extensions/snippets/workers/queue-service/Properties/launchSettings.json diff --git a/docs/core/extensions/snippets/workers/7.0/queue-service/QueuedHostedService.cs b/docs/core/extensions/snippets/workers/queue-service/QueuedHostedService.cs similarity index 56% rename from docs/core/extensions/snippets/workers/7.0/queue-service/QueuedHostedService.cs rename to docs/core/extensions/snippets/workers/queue-service/QueuedHostedService.cs index daccadeaf230d..cdc3fc3aa98f9 100644 --- a/docs/core/extensions/snippets/workers/7.0/queue-service/QueuedHostedService.cs +++ b/docs/core/extensions/snippets/workers/queue-service/QueuedHostedService.cs @@ -1,21 +1,17 @@ namespace App.QueueService; -public sealed class QueuedHostedService : BackgroundService -{ - private readonly IBackgroundTaskQueue _taskQueue; - private readonly ILogger _logger; - - public QueuedHostedService( +public sealed class QueuedHostedService( IBackgroundTaskQueue taskQueue, - ILogger logger) => - (_taskQueue, _logger) = (taskQueue, logger); - + ILogger logger) : BackgroundService +{ protected override Task ExecuteAsync(CancellationToken stoppingToken) { - _logger.LogInformation( - $"{nameof(QueuedHostedService)} is running.{Environment.NewLine}" + - $"{Environment.NewLine}Tap W to add a work item to the " + - $"background queue.{Environment.NewLine}"); + logger.LogInformation(""" + {Name} is running. + Tap W to add a work item to the + background queue. + """, + nameof(QueuedHostedService)); return ProcessTaskQueueAsync(stoppingToken); } @@ -27,7 +23,7 @@ private async Task ProcessTaskQueueAsync(CancellationToken stoppingToken) try { Func? workItem = - await _taskQueue.DequeueAsync(stoppingToken); + await taskQueue.DequeueAsync(stoppingToken); await workItem(stoppingToken); } @@ -37,14 +33,14 @@ private async Task ProcessTaskQueueAsync(CancellationToken stoppingToken) } catch (Exception ex) { - _logger.LogError(ex, "Error occurred executing task work item."); + logger.LogError(ex, "Error occurred executing task work item."); } } } public override async Task StopAsync(CancellationToken stoppingToken) { - _logger.LogInformation( + logger.LogInformation( $"{nameof(QueuedHostedService)} is stopping."); await base.StopAsync(stoppingToken); diff --git a/docs/core/extensions/snippets/workers/6.0/queue-service/appsettings.Development.json b/docs/core/extensions/snippets/workers/queue-service/appsettings.Development.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/queue-service/appsettings.Development.json rename to docs/core/extensions/snippets/workers/queue-service/appsettings.Development.json diff --git a/docs/core/extensions/snippets/workers/6.0/queue-service/appsettings.json b/docs/core/extensions/snippets/workers/queue-service/appsettings.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/queue-service/appsettings.json rename to docs/core/extensions/snippets/workers/queue-service/appsettings.json diff --git a/docs/core/extensions/snippets/workers/6.0/scoped-service/App.ScopedService.csproj b/docs/core/extensions/snippets/workers/scoped-service/App.ScopedService.csproj similarity index 87% rename from docs/core/extensions/snippets/workers/6.0/scoped-service/App.ScopedService.csproj rename to docs/core/extensions/snippets/workers/scoped-service/App.ScopedService.csproj index 65a6f5ded3957..70ac0f93c09f4 100644 --- a/docs/core/extensions/snippets/workers/6.0/scoped-service/App.ScopedService.csproj +++ b/docs/core/extensions/snippets/workers/scoped-service/App.ScopedService.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 enable true App.ScopedService diff --git a/docs/core/extensions/snippets/workers/7.0/scoped-service/DefaultScopedProcessingService.cs b/docs/core/extensions/snippets/workers/scoped-service/DefaultScopedProcessingService.cs similarity index 59% rename from docs/core/extensions/snippets/workers/7.0/scoped-service/DefaultScopedProcessingService.cs rename to docs/core/extensions/snippets/workers/scoped-service/DefaultScopedProcessingService.cs index 55b6baa9bf3b2..b27f66ebf3a31 100644 --- a/docs/core/extensions/snippets/workers/7.0/scoped-service/DefaultScopedProcessingService.cs +++ b/docs/core/extensions/snippets/workers/scoped-service/DefaultScopedProcessingService.cs @@ -1,13 +1,9 @@ namespace App.ScopedService; -public sealed class DefaultScopedProcessingService : IScopedProcessingService +public sealed class DefaultScopedProcessingService( + ILogger logger) : IScopedProcessingService { private int _executionCount; - private readonly ILogger _logger; - - public DefaultScopedProcessingService( - ILogger logger) => - _logger = logger; public async Task DoWorkAsync(CancellationToken stoppingToken) { @@ -15,7 +11,7 @@ public async Task DoWorkAsync(CancellationToken stoppingToken) { ++ _executionCount; - _logger.LogInformation( + logger.LogInformation( "{ServiceName} working, execution count: {Count}", nameof(DefaultScopedProcessingService), _executionCount); diff --git a/docs/core/extensions/snippets/workers/6.0/scoped-service/IScopedProcessingService.cs b/docs/core/extensions/snippets/workers/scoped-service/IScopedProcessingService.cs similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/scoped-service/IScopedProcessingService.cs rename to docs/core/extensions/snippets/workers/scoped-service/IScopedProcessingService.cs diff --git a/docs/core/extensions/snippets/workers/7.0/scoped-service/Program.cs b/docs/core/extensions/snippets/workers/scoped-service/Program.cs similarity index 100% rename from docs/core/extensions/snippets/workers/7.0/scoped-service/Program.cs rename to docs/core/extensions/snippets/workers/scoped-service/Program.cs diff --git a/docs/core/extensions/snippets/workers/6.0/scoped-service/Properties/launchSettings.json b/docs/core/extensions/snippets/workers/scoped-service/Properties/launchSettings.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/scoped-service/Properties/launchSettings.json rename to docs/core/extensions/snippets/workers/scoped-service/Properties/launchSettings.json diff --git a/docs/core/extensions/snippets/workers/scoped-service/ScopedBackgroundService.cs b/docs/core/extensions/snippets/workers/scoped-service/ScopedBackgroundService.cs new file mode 100644 index 0000000000000..806d49752ee38 --- /dev/null +++ b/docs/core/extensions/snippets/workers/scoped-service/ScopedBackgroundService.cs @@ -0,0 +1,38 @@ +namespace App.ScopedService; + +public sealed class ScopedBackgroundService( + IServiceProvider serviceProvider, + ILogger logger) : BackgroundService +{ + private const string ClassName = nameof(ScopedBackgroundService); + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + logger.LogInformation( + "{Name} is running.", ClassName); + + await DoWorkAsync(stoppingToken); + } + + private async Task DoWorkAsync(CancellationToken stoppingToken) + { + logger.LogInformation( + "{Name} is working.", ClassName); + + using (IServiceScope scope = serviceProvider.CreateScope()) + { + IScopedProcessingService scopedProcessingService = + scope.ServiceProvider.GetRequiredService(); + + await scopedProcessingService.DoWorkAsync(stoppingToken); + } + } + + public override async Task StopAsync(CancellationToken stoppingToken) + { + logger.LogInformation( + "{Name} is stopping.", ClassName); + + await base.StopAsync(stoppingToken); + } +} diff --git a/docs/core/extensions/snippets/workers/6.0/scoped-service/appsettings.Development.json b/docs/core/extensions/snippets/workers/scoped-service/appsettings.Development.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/scoped-service/appsettings.Development.json rename to docs/core/extensions/snippets/workers/scoped-service/appsettings.Development.json diff --git a/docs/core/extensions/snippets/workers/6.0/scoped-service/appsettings.json b/docs/core/extensions/snippets/workers/scoped-service/appsettings.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/scoped-service/appsettings.json rename to docs/core/extensions/snippets/workers/scoped-service/appsettings.json diff --git a/docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/App.SignalCompletionService.csproj b/docs/core/extensions/snippets/workers/signal-completion-service/App.SignalCompletionService/App.SignalCompletionService.csproj similarity index 85% rename from docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/App.SignalCompletionService.csproj rename to docs/core/extensions/snippets/workers/signal-completion-service/App.SignalCompletionService/App.SignalCompletionService.csproj index c85b144da22c9..8a6b9835c4266 100644 --- a/docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/App.SignalCompletionService.csproj +++ b/docs/core/extensions/snippets/workers/signal-completion-service/App.SignalCompletionService/App.SignalCompletionService.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable enable diff --git a/docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/Program.cs b/docs/core/extensions/snippets/workers/signal-completion-service/App.SignalCompletionService/Program.cs similarity index 100% rename from docs/core/extensions/snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/Program.cs rename to docs/core/extensions/snippets/workers/signal-completion-service/App.SignalCompletionService/Program.cs diff --git a/docs/core/extensions/snippets/workers/6.0/signal-completion-service/App.SignalCompletionService/Properties/launchSettings.json b/docs/core/extensions/snippets/workers/signal-completion-service/App.SignalCompletionService/Properties/launchSettings.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/signal-completion-service/App.SignalCompletionService/Properties/launchSettings.json rename to docs/core/extensions/snippets/workers/signal-completion-service/App.SignalCompletionService/Properties/launchSettings.json diff --git a/docs/core/extensions/snippets/workers/signal-completion-service/App.SignalCompletionService/Worker.cs b/docs/core/extensions/snippets/workers/signal-completion-service/App.SignalCompletionService/Worker.cs new file mode 100644 index 0000000000000..207ff5c9c03dc --- /dev/null +++ b/docs/core/extensions/snippets/workers/signal-completion-service/App.SignalCompletionService/Worker.cs @@ -0,0 +1,18 @@ +namespace App.SignalCompletionService; + +public sealed class Worker( + IHostApplicationLifetime hostApplicationLifetime, + ILogger logger) : BackgroundService +{ + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + // TODO: implement single execution logic here. + logger.LogInformation( + "Worker running at: {Time}", DateTimeOffset.Now); + + await Task.Delay(1_000, stoppingToken); + + // When completed, the entire app host will stop. + hostApplicationLifetime.StopApplication(); + } +} diff --git a/docs/core/extensions/snippets/workers/6.0/signal-completion-service/App.SignalCompletionService/appsettings.Development.json b/docs/core/extensions/snippets/workers/signal-completion-service/App.SignalCompletionService/appsettings.Development.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/signal-completion-service/App.SignalCompletionService/appsettings.Development.json rename to docs/core/extensions/snippets/workers/signal-completion-service/App.SignalCompletionService/appsettings.Development.json diff --git a/docs/core/extensions/snippets/workers/6.0/signal-completion-service/App.SignalCompletionService/appsettings.json b/docs/core/extensions/snippets/workers/signal-completion-service/App.SignalCompletionService/appsettings.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/signal-completion-service/App.SignalCompletionService/appsettings.json rename to docs/core/extensions/snippets/workers/signal-completion-service/App.SignalCompletionService/appsettings.json diff --git a/docs/core/extensions/snippets/workers/7.0/timer-service/App.TimerHostedService.csproj b/docs/core/extensions/snippets/workers/timer-service/App.TimerHostedService.csproj similarity index 87% rename from docs/core/extensions/snippets/workers/7.0/timer-service/App.TimerHostedService.csproj rename to docs/core/extensions/snippets/workers/timer-service/App.TimerHostedService.csproj index 9b1c4ef08ff98..14768da7293e6 100644 --- a/docs/core/extensions/snippets/workers/7.0/timer-service/App.TimerHostedService.csproj +++ b/docs/core/extensions/snippets/workers/timer-service/App.TimerHostedService.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable true App.TimerHostedService diff --git a/docs/core/extensions/snippets/workers/7.0/timer-service/Program.cs b/docs/core/extensions/snippets/workers/timer-service/Program.cs similarity index 100% rename from docs/core/extensions/snippets/workers/7.0/timer-service/Program.cs rename to docs/core/extensions/snippets/workers/timer-service/Program.cs diff --git a/docs/core/extensions/snippets/workers/6.0/timer-service/Properties/launchSettings.json b/docs/core/extensions/snippets/workers/timer-service/Properties/launchSettings.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/timer-service/Properties/launchSettings.json rename to docs/core/extensions/snippets/workers/timer-service/Properties/launchSettings.json diff --git a/docs/core/extensions/snippets/workers/7.0/timer-service/TimerService.cs b/docs/core/extensions/snippets/workers/timer-service/TimerService.cs similarity index 74% rename from docs/core/extensions/snippets/workers/7.0/timer-service/TimerService.cs rename to docs/core/extensions/snippets/workers/timer-service/TimerService.cs index bad35e8559244..8419336484c97 100644 --- a/docs/core/extensions/snippets/workers/7.0/timer-service/TimerService.cs +++ b/docs/core/extensions/snippets/workers/timer-service/TimerService.cs @@ -1,17 +1,14 @@ namespace App.TimerHostedService; -public sealed class TimerService : IHostedService, IAsyncDisposable +public sealed class TimerService(ILogger logger) : IHostedService, IAsyncDisposable { private readonly Task _completedTask = Task.CompletedTask; - private readonly ILogger _logger; private int _executionCount = 0; private Timer? _timer; - public TimerService(ILogger logger) => _logger = logger; - public Task StartAsync(CancellationToken stoppingToken) { - _logger.LogInformation("{Service} is running.", nameof(TimerHostedService)); + logger.LogInformation("{Service} is running.", nameof(TimerHostedService)); _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5)); return _completedTask; @@ -21,7 +18,7 @@ private void DoWork(object? state) { int count = Interlocked.Increment(ref _executionCount); - _logger.LogInformation( + logger.LogInformation( "{Service} is working, execution count: {Count:#,0}", nameof(TimerHostedService), count); @@ -29,7 +26,7 @@ private void DoWork(object? state) public Task StopAsync(CancellationToken stoppingToken) { - _logger.LogInformation( + logger.LogInformation( "{Service} is stopping.", nameof(TimerHostedService)); _timer?.Change(Timeout.Infinite, 0); diff --git a/docs/core/extensions/snippets/workers/6.0/timer-service/appsettings.Development.json b/docs/core/extensions/snippets/workers/timer-service/appsettings.Development.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/timer-service/appsettings.Development.json rename to docs/core/extensions/snippets/workers/timer-service/appsettings.Development.json diff --git a/docs/core/extensions/snippets/workers/6.0/timer-service/appsettings.json b/docs/core/extensions/snippets/workers/timer-service/appsettings.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/timer-service/appsettings.json rename to docs/core/extensions/snippets/workers/timer-service/appsettings.json diff --git a/docs/core/extensions/snippets/workers/7.0/windows-service-installer/App.WindowsService.Installer/App.WindowsService.Installer.vdproj b/docs/core/extensions/snippets/workers/windows-service-installer/App.WindowsService.Installer/App.WindowsService.Installer.vdproj similarity index 100% rename from docs/core/extensions/snippets/workers/7.0/windows-service-installer/App.WindowsService.Installer/App.WindowsService.Installer.vdproj rename to docs/core/extensions/snippets/workers/windows-service-installer/App.WindowsService.Installer/App.WindowsService.Installer.vdproj diff --git a/docs/core/extensions/snippets/workers/6.0/windows-service-setup/App.WindowsService.Setup/App.WindowsService.Setup.wixproj b/docs/core/extensions/snippets/workers/windows-service-setup/App.WindowsService.Setup/App.WindowsService.Setup.wixproj similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/windows-service-setup/App.WindowsService.Setup/App.WindowsService.Setup.wixproj rename to docs/core/extensions/snippets/workers/windows-service-setup/App.WindowsService.Setup/App.WindowsService.Setup.wixproj diff --git a/docs/core/extensions/snippets/workers/7.0/windows-service-setup/App.WindowsService.Setup/Package.wxs b/docs/core/extensions/snippets/workers/windows-service-setup/App.WindowsService.Setup/Package.wxs similarity index 100% rename from docs/core/extensions/snippets/workers/7.0/windows-service-setup/App.WindowsService.Setup/Package.wxs rename to docs/core/extensions/snippets/workers/windows-service-setup/App.WindowsService.Setup/Package.wxs diff --git a/docs/core/extensions/snippets/workers/7.0/windows-service/App.WindowsService.csproj b/docs/core/extensions/snippets/workers/windows-service/App.WindowsService.csproj similarity index 92% rename from docs/core/extensions/snippets/workers/7.0/windows-service/App.WindowsService.csproj rename to docs/core/extensions/snippets/workers/windows-service/App.WindowsService.csproj index 9d152d7c75ec1..917593e3831f0 100644 --- a/docs/core/extensions/snippets/workers/7.0/windows-service/App.WindowsService.csproj +++ b/docs/core/extensions/snippets/workers/windows-service/App.WindowsService.csproj @@ -1,7 +1,7 @@ - net7.0-windows + net8.0-windows enable true App.WindowsService diff --git a/docs/core/extensions/snippets/workers/6.0/windows-service/JokeService.cs b/docs/core/extensions/snippets/workers/windows-service/JokeService.cs similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/windows-service/JokeService.cs rename to docs/core/extensions/snippets/workers/windows-service/JokeService.cs diff --git a/docs/core/extensions/snippets/workers/7.0/windows-service/Program.cs b/docs/core/extensions/snippets/workers/windows-service/Program.cs similarity index 100% rename from docs/core/extensions/snippets/workers/7.0/windows-service/Program.cs rename to docs/core/extensions/snippets/workers/windows-service/Program.cs diff --git a/docs/core/extensions/snippets/workers/6.0/windows-service/Properties/PublishProfiles/FolderProfile.pubxml b/docs/core/extensions/snippets/workers/windows-service/Properties/PublishProfiles/FolderProfile.pubxml similarity index 80% rename from docs/core/extensions/snippets/workers/6.0/windows-service/Properties/PublishProfiles/FolderProfile.pubxml rename to docs/core/extensions/snippets/workers/windows-service/Properties/PublishProfiles/FolderProfile.pubxml index e234bc6f23f40..ee87e29968a6b 100644 --- a/docs/core/extensions/snippets/workers/6.0/windows-service/Properties/PublishProfiles/FolderProfile.pubxml +++ b/docs/core/extensions/snippets/workers/windows-service/Properties/PublishProfiles/FolderProfile.pubxml @@ -6,9 +6,9 @@ https://go.microsoft.com/fwlink/?LinkID=208121. Release Any CPU - bin\Release\net6.0-windows\win-x64\publish\ + bin\Release\net8.0-windows\win-x64\publish\ FileSystem - net6.0-windows + net8.0-windows win-x64 true true diff --git a/docs/core/extensions/snippets/workers/6.0/windows-service/Properties/launchSettings.json b/docs/core/extensions/snippets/workers/windows-service/Properties/launchSettings.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/windows-service/Properties/launchSettings.json rename to docs/core/extensions/snippets/workers/windows-service/Properties/launchSettings.json diff --git a/docs/core/extensions/snippets/workers/7.0/windows-service/WindowsBackgroundService.cs b/docs/core/extensions/snippets/workers/windows-service/WindowsBackgroundService.cs similarity index 70% rename from docs/core/extensions/snippets/workers/7.0/windows-service/WindowsBackgroundService.cs rename to docs/core/extensions/snippets/workers/windows-service/WindowsBackgroundService.cs index e2f2e9722e798..2bc9b7701c0e3 100644 --- a/docs/core/extensions/snippets/workers/7.0/windows-service/WindowsBackgroundService.cs +++ b/docs/core/extensions/snippets/workers/windows-service/WindowsBackgroundService.cs @@ -1,23 +1,17 @@ namespace App.WindowsService; -public sealed class WindowsBackgroundService : BackgroundService +public sealed class WindowsBackgroundService( + JokeService jokeService, + ILogger logger) : BackgroundService { - private readonly JokeService _jokeService; - private readonly ILogger _logger; - - public WindowsBackgroundService( - JokeService jokeService, - ILogger logger) => - (_jokeService, _logger) = (jokeService, logger); - protected override async Task ExecuteAsync(CancellationToken stoppingToken) { try { while (!stoppingToken.IsCancellationRequested) { - string joke = _jokeService.GetJoke(); - _logger.LogWarning("{Joke}", joke); + string joke = jokeService.GetJoke(); + logger.LogWarning("{Joke}", joke); await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken); } @@ -29,7 +23,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) } catch (Exception ex) { - _logger.LogError(ex, "{Message}", ex.Message); + 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 diff --git a/docs/core/extensions/snippets/workers/6.0/windows-service/appsettings.Development.json b/docs/core/extensions/snippets/workers/windows-service/appsettings.Development.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/windows-service/appsettings.Development.json rename to docs/core/extensions/snippets/workers/windows-service/appsettings.Development.json diff --git a/docs/core/extensions/snippets/workers/6.0/windows-service/appsettings.json b/docs/core/extensions/snippets/workers/windows-service/appsettings.json similarity index 100% rename from docs/core/extensions/snippets/workers/6.0/windows-service/appsettings.json rename to docs/core/extensions/snippets/workers/windows-service/appsettings.json diff --git a/docs/core/extensions/timer-service.md b/docs/core/extensions/timer-service.md index 839dd4d1c8c93..fa526a54949bb 100644 --- a/docs/core/extensions/timer-service.md +++ b/docs/core/extensions/timer-service.md @@ -3,9 +3,8 @@ title: Implement the IHostedService interface description: Learn how to implement a custom IHostedService interface in C#, much like the inbuilt .NET BackgroundService. author: IEvangelist ms.author: dapine -ms.date: 05/09/2023 +ms.date: 12/13/2023 ms.topic: tutorial -zone_pivot_groups: dotnet-version --- # Implement the `IHostedService` interface @@ -24,21 +23,10 @@ In this tutorial, you learn how to: ## Prerequisites -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -- The [.NET 7.0 SDK or later](https://dotnet.microsoft.com/download/dotnet/7.0) +- The [.NET 8.0 SDK or later](https://dotnet.microsoft.com/download/dotnet/8.0) - A .NET integrated development environment (IDE) - Feel free to use [Visual Studio](https://visualstudio.microsoft.com) -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -- The [.NET 6.0 SDK or later](https://dotnet.microsoft.com/download/dotnet/6.0) -- A .NET integrated development environment (IDE) - - Feel free to use [Visual Studio](https://visualstudio.microsoft.com) - -:::zone-end - [!INCLUDE [file-new-worker](includes/file-new-worker.md)] @@ -48,16 +36,7 @@ The timer-based background service makes use of the [!IMPORTANT] > The `Worker` was a subclass of . Now, the `TimerService` implements both the , and interfaces. @@ -71,16 +50,7 @@ When is called, Replace the existing `Program` contents with the following C# code: -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code source="snippets/workers/7.0/timer-service/Program.cs" highlight="4"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code source="snippets/workers/6.0/timer-service/Program.cs" highlight="4-7"::: - -:::zone-end +:::code source="snippets/workers/timer-service/Program.cs" highlight="4"::: The service is registered in (*Program.cs*) with the `AddHostedService` extension method. This is the same extension method you use when registering subclasses, as they both implement the interface. diff --git a/docs/core/extensions/windows-service-with-installer.md b/docs/core/extensions/windows-service-with-installer.md index 54122cdfbb0b0..cac95fa80127e 100644 --- a/docs/core/extensions/windows-service-with-installer.md +++ b/docs/core/extensions/windows-service-with-installer.md @@ -3,7 +3,7 @@ title: Create a Windows Service installer description: Learn how to create a Windows Service installer project. author: IEvangelist ms.author: dapine -ms.date: 06/12/2023 +ms.date: 12/13/2023 ms.topic: tutorial --- @@ -23,7 +23,7 @@ In this tutorial, you'll learn how to: ## Prerequisites - You're expected to have completed the [Create a Windows Service](windows-service.md) tutorial, or be prepared to clone the sample repo. -- The [.NET 6.0 SDK or later](https://dotnet.microsoft.com/download/dotnet) +- The [.NET 8.0 SDK or later](https://dotnet.microsoft.com/download/dotnet) - A Windows OS - A .NET integrated development environment (IDE) - Feel free to use [Visual Studio](https://visualstudio.microsoft.com) diff --git a/docs/core/extensions/windows-service.md b/docs/core/extensions/windows-service.md index d729ed1fd5703..19b3d7538f532 100644 --- a/docs/core/extensions/windows-service.md +++ b/docs/core/extensions/windows-service.md @@ -3,9 +3,8 @@ title: Create Windows Service using BackgroundService description: Learn how to create a Windows Service using the BackgroundService in .NET. author: IEvangelist ms.author: dapine -ms.date: 09/08/2023 +ms.date: 12/13/2023 ms.topic: tutorial -zone_pivot_groups: dotnet-version --- # Create Windows Service using `BackgroundService` @@ -29,23 +28,11 @@ In this tutorial, you'll learn how to: ## Prerequisites -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -- The [.NET 7.0 SDK or later](https://dotnet.microsoft.com/download/dotnet/7.0) -- A Windows OS -- A .NET integrated development environment (IDE) - - Feel free to use [Visual Studio](https://visualstudio.microsoft.com) - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -- The [.NET 6.0 SDK or later](https://dotnet.microsoft.com/download/dotnet/6.0) +- The [.NET 8.0 SDK or later](https://dotnet.microsoft.com/download/dotnet/8.0) - A Windows OS - A .NET integrated development environment (IDE) - Feel free to use [Visual Studio](https://visualstudio.microsoft.com) -:::zone-end - [!INCLUDE [file-new-worker](includes/file-new-worker.md)] @@ -63,31 +50,13 @@ For more information on the .NET CLI add package command, see [dotnet add packag After successfully adding the packages, your project file should now contain the following package references: -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code language="xml" source="snippets/workers/7.0/windows-service/App.WindowsService.csproj" range="14-17" highlight="2-3"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code language="xml" source="snippets/workers/6.0/windows-service/App.WindowsService.csproj" range="14-17" highlight="2-3"::: - -:::zone-end +:::code language="xml" source="snippets/workers/windows-service/App.WindowsService.csproj" range="14-17" highlight="2-3"::: ## Update project file This worker project makes use of C#'s [nullable reference types](../../csharp/nullable-references.md). To enable them for the entire project, update the project file accordingly: -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code language="xml" source="snippets/workers/7.0/windows-service/App.WindowsService.csproj" range="1-7,12-20" highlight="5"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code language="xml" source="snippets/workers/6.0/windows-service/App.WindowsService.csproj" range="1-7,12-20" highlight="5"::: - -:::zone-end +:::code language="xml" source="snippets/workers/windows-service/App.WindowsService.csproj" range="1-7,12-20" highlight="5"::: The preceding project file changes add the `enable` node. For more information, see [Setting the nullable context](../../csharp/language-reference/builtin-types/nullable-reference-types.md#setting-the-nullable-context). @@ -95,16 +64,7 @@ The preceding project file changes add the `enable` node. Fo Add a new class to the project named *JokeService.cs*, and replace its contents with the following C# code: -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code source="snippets/workers/7.0/windows-service/JokeService.cs"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code source="snippets/workers/6.0/windows-service/JokeService.cs"::: - -:::zone-end +:::code source="snippets/workers/windows-service/JokeService.cs"::: The preceding joke service source code exposes a single piece of functionality, the `GetJoke` method. This is a `string` returning method that represents a random programming joke. The class-scoped `_jokes` field is used to store the list of jokes. A random joke is selected from the list and returned. @@ -112,16 +72,7 @@ The preceding joke service source code exposes a single piece of functionality, Replace the existing `Worker` from the template with the following C# code, and rename the file to *WindowsBackgroundService.cs*: -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code source="snippets/workers/7.0/windows-service/WindowsBackgroundService.cs"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code source="snippets/workers/6.0/windows-service/WindowsBackgroundService.cs"::: - -:::zone-end +:::code source="snippets/workers/windows-service/WindowsBackgroundService.cs"::: In the preceding code, the `JokeService` is injected along with an `ILogger`. Both are made available to the class as `private readonly` fields. In the `ExecuteAsync` method, the joke service requests a joke and writes it to the logger. In this case, the logger is implemented by the Windows Event Log - . Logs are written to, and available for viewing in the **Event Viewer**. @@ -152,21 +103,10 @@ In the preceding code, the `JokeService` is injected along with an `ILogger`. Bo Replace the template *Program.cs* file contents with the following C# code: -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code source="snippets/workers/7.0/windows-service/Program.cs" highlight="6-9,14-15"::: +:::code source="snippets/workers/windows-service/Program.cs" highlight="6-9,14-15"::: The `AddWindowsService` extension method configures the app to work as a Windows Service. The service name is set to `".NET Joke Service"`. The hosted service is registered for dependency injection. -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code source="snippets/workers/6.0/windows-service/Program.cs" highlight="6-9,15-16"::: - -The extension method configures the app to work as a Windows Service. The service name is set to `".NET Joke Service"`. The hosted service is registered for dependency injection. - -:::zone-end - For more information on registering services, see [Dependency injection in .NET](dependency-injection.md). ## Publish the app @@ -180,17 +120,7 @@ To create the .NET Worker Service app as a Windows Service, it's recommended tha > sc.exe create ".NET Joke Service" binpath="C:\Path\To\dotnet.exe C:\Path\To\App.WindowsService.dll" > ``` -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code language="xml" source="snippets/workers/7.0/windows-service/App.WindowsService.csproj" highlight="8-11"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code language="xml" source="snippets/workers/6.0/windows-service/App.WindowsService.csproj" highlight="8-11"::: - -:::zone-end - +:::code language="xml" source="snippets/workers/windows-service/App.WindowsService.csproj" highlight="8-11"::: The preceding highlighted lines of the project file define the following behaviors: - `exe`: Creates a console application. @@ -206,16 +136,7 @@ Right-click on the project in the **Solution Explorer**, and select **Publish... Leave the default **Location**, and then select **Finish**. Once the profile is created, select **Show all settings**, and verify your **Profile settings**. -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::image type="content" source="media/profile-settings-7.0.png" lightbox="media/profile-settings-7.0.png" alt-text="The Visual Studio Profile settings"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::image type="content" source="media/profile-settings-6.0.png" lightbox="media/profile-settings-6.0.png" alt-text="The Visual Studio Profile settings"::: - -:::zone-end +:::image type="content" source="media/profile-settings.png" lightbox="media/profile-settings.png" alt-text="The Visual Studio Profile settings"::: Ensure that the following settings are specified: @@ -320,16 +241,7 @@ With .NET 6, [new hosting exception-handling behaviors](../compatibility/core-li The default behavior before .NET 6 is `Ignore`, which resulted in *zombie processes* (a running process that didn't do anything). With .NET 6, the default behavior is `StopHost`, which results in the host being stopped when an exception is thrown. But it stops cleanly, meaning that the Windows Service management system will not restart the service. To correctly allow the service to be restarted, you can call with a non-zero exit code. Consider the following highlighted `catch` block: -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code source="snippets/workers/7.0/windows-service/WindowsBackgroundService.cs" highlight="30-43"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code source="snippets/workers/6.0/windows-service/WindowsBackgroundService.cs" highlight="30-43"::: - -:::zone-end +:::code source="snippets/workers/windows-service/WindowsBackgroundService.cs" highlight="24-37"::: ## Verify service functionality diff --git a/docs/core/extensions/workers.md b/docs/core/extensions/workers.md index b7e7d429f4ff3..dd6194346d290 100644 --- a/docs/core/extensions/workers.md +++ b/docs/core/extensions/workers.md @@ -3,9 +3,8 @@ title: Worker Services description: Learn how to implement a custom IHostedService and use existing implementations in C#. Discover various worker implementations, templates, and service patterns. author: IEvangelist ms.author: dapine -ms.date: 10/13/2023 +ms.date: 12/13/2023 ms.topic: overview -zone_pivot_groups: dotnet-version --- # Worker services in .NET @@ -36,16 +35,7 @@ Many terms are mistakenly used synonymously. In this section, there are definiti The Worker Service template is available to the .NET CLI, and Visual Studio. For more information, see [.NET CLI, `dotnet new worker` - template](../tools/dotnet-new-sdk-templates.md#web-others). The template consists of a `Program` and `Worker` class. -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code language="csharp" source="snippets/workers/7.0/background-service/Program.cs"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code language="csharp" source="snippets/workers/6.0/background-service/Program.cs"::: - -:::zone-end +:::code language="csharp" source="snippets/workers/background-service/Program.cs"::: The preceding `Program` class: @@ -79,16 +69,7 @@ For more information regarding performance considerations, see [Server GC](../.. As for the `Worker`, the template provides a simple implementation. -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code language="csharp" source="snippets/workers/7.0/background-service/Worker.cs"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code language="csharp" source="snippets/workers/6.0/background-service/Worker.cs"::: - -:::zone-end +:::code language="csharp" source="snippets/workers/background-service/Worker.cs"::: The preceding `Worker` class is a subclass of , which implements . The is an `abstract class` and requires the subclass to implement . In the template implementation, the `ExecuteAsync` loops once per second, logging the current date and time until the process is signaled to cancel. @@ -110,56 +91,26 @@ An app based on the Worker template uses the `Microsoft.NET.Sdk.Worker` SDK and With most modern .NET workloads, containers are a viable option. When creating a long-running service from the Worker template in Visual Studio, you can opt in to **Docker support**. Doing so creates a *Dockerfile* that containerizes your .NET app. A [*Dockerfile*](https://docs.docker.com/engine/reference/builder) is a set of instructions to build an image. For .NET apps, the *Dockerfile* usually sits in the root of the directory next to a solution file. -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code language="dockerfile" source="snippets/workers/7.0/background-service/Dockerfile"::: +:::code language="dockerfile" source="snippets/workers/background-service/Dockerfile"::: The preceding *Dockerfile* steps include: -- Setting the base image from `mcr.microsoft.com/dotnet/runtime:7.0` as the alias `base`. +- Setting the base image from `mcr.microsoft.com/dotnet/runtime:8.0` as the alias `base`. - Changing the working directory to */app*. -- Setting the `build` alias from the `mcr.microsoft.com/dotnet/sdk:7.0` image. +- Setting the `build` alias from the `mcr.microsoft.com/dotnet/sdk:8.0` image. - Changing the working directory to */src*. - Copying the contents and publishing the .NET app: - The app is published using the [`dotnet publish`](../tools/dotnet-publish.md) command. -- Relayering the .NET SDK image from `mcr.microsoft.com/dotnet/runtime:7.0` (the `base` alias). +- Relayering the .NET SDK image from `mcr.microsoft.com/dotnet/runtime:8.0` (the `base` alias). - Copying the published build output from the */publish*. - Defining the entry point, which delegates to [`dotnet App.BackgroundService.dll`](../tools/dotnet.md). -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code language="dockerfile" source="snippets/workers/6.0/background-service/Dockerfile"::: - -The preceding *Dockerfile* steps include: - -- Setting the base image from `mcr.microsoft.com/dotnet/runtime:6.0` as the alias `base`. -- Changing the working directory to */app*. -- Setting the `build` alias from the `mcr.microsoft.com/dotnet/sdk:6.0` image. -- Changing the working directory to */src*. -- Copying the contents and publishing the .NET app: - - The app is published using the [`dotnet publish`](../tools/dotnet-publish.md) command. -- Relayering the .NET SDK image from `mcr.microsoft.com/dotnet/runtime:6.0` (the `base` alias). -- Copying the published build output from the */publish*. -- Defining the entry point, which delegates to [`dotnet App.BackgroundService.dll`](../tools/dotnet.md). - -:::zone-end - > [!TIP] > The MCR in `mcr.microsoft.com` stands for "Microsoft Container Registry", and is Microsoft's syndicated container catalog from the official Docker hub. The [Microsoft syndicates container catalog](https://azure.microsoft.com/blog/microsoft-syndicates-container-catalog) article contains additional details. When you target Docker as a deployment strategy for your .NET Worker Service, there are a few considerations in the project file: -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code language="xml" source="snippets/workers/7.0/background-service/App.WorkerService.csproj" highlight="8,13"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code language="xml" source="snippets/workers/6.0/background-service/App.WorkerService.csproj" highlight="8,13"::: - -:::zone-end +:::code language="xml" source="snippets/workers/background-service/App.WorkerService.csproj" highlight="8,13"::: In the preceding project file, the `` element specifies `Linux` as its target. To target Windows containers, use `Windows` instead. The [`Microsoft.VisualStudio.Azure.Containers.Tools.Targets` NuGet package](https://www.nuget.org/packages/Microsoft.VisualStudio.Azure.Containers.Tools.Targets) is automatically added as a package reference when **Docker support** is selected from the template. @@ -187,16 +138,7 @@ These two methods serve as *lifecycle* methods - they're called during host star In most common scenarios, you don't need to explicitly signal the completion of a hosted service. When the host starts the services, they're designed to run until the host is stopped. In some scenarios, however, you may need to signal the completion of the entire host application when the service completes. To signal the completion, consider the following `Worker` class: -:::zone target="docs" pivot="dotnet-8-0,dotnet-7-0" - -:::code source="snippets/workers/7.0/signal-completion-service/App.SignalCompletionService/Worker.cs"::: - -:::zone-end -:::zone target="docs" pivot="dotnet-6-0" - -:::code source="snippets/workers/6.0/signal-completion-service/App.SignalCompletionService/Worker.cs"::: - -:::zone-end +:::code source="snippets/workers/signal-completion-service/App.SignalCompletionService/Worker.cs"::: In the preceding code, the `ExecuteAsync` method doesn't loop, and when it's complete it calls .