Skip to content

BackgroundService that doesn't call base.StartAsync leads to NullReferenceException - .NET 6 breaking change #60131

@davidni

Description

@davidni

Description

.NET 6.0 introduced an undocumented breaking change. IHostedService startup is now special-cased for BackgroundService, where the Host takes a direct dependency on BackgroundService.ExecuteTask, which can be null in some cases that previously worked.

private async Task TryExecuteBackgroundServiceAsync(BackgroundService backgroundService)
{
try
{
await backgroundService.ExecuteTask.ConfigureAwait(false);

When BackgroundService.ExecuteTask is null (e.g. because the override for BackgroundService.StartAsync decided not to call the base impl), this throws a NullReferenceException and causes the Host to abort (instead of previous behavior where IHostedService.StartAsync was called and that was it.

Example BackgroundService impl that breaks

class MyBackgroundService : BackgroundService
{
    public override Task StartAsync(CancellationToken cancellation)
    {
        return Task.CompletedTask;
    }

    protected override Task ExecuteAsync(CancellationToken stoppingToken)
    {
        return Task.CompletedTask;
    }
}

Configuration

  • Which version of .NET is the code running on? .NET 6.0.100-rc.1.21463.6
  • What OS and version, and what distro if applicable? Windows 10, but issue is not platform-specific
  • What is the architecture (x64, x86, ARM, ARM64)? x64, but issue is not platform-specific
  • Do you know whether it is specific to that configuration? Not platform-specific

Regression?

Yes, this is a breaking change in .NET 6. Previous versions did not special-case BackgroundService, and instead treated all IHostedService's uniformly. The new behavior IMHO violates the Principle of Least Astonishment.

Other information

Breaking change was introduced in #42981

Expectations for this issue

Either fix the regression, or document it as a breaking change in https://docs.microsoft.com/en-us/dotnet/core/compatibility/6.0

Metadata

Metadata

Assignees

Labels

area-Extensions-Hostingin-prThere is an active PR which will close this issue when it is merged

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions