dotnet-api-docs icon indicating copy to clipboard operation
dotnet-api-docs copied to clipboard

When using `ThreadPool.QueueUserWorkItem` with a method that throws an exception, the entire application crashes and exits unexpectedly. This behavior is not documented and can lead to unintended application terminations.

Open 1257960069 opened this issue 10 months ago • 1 comments

Type of issue

Typo

Description

[在此处输入反馈]

using Microsoft.AspNetCore.Mvc;

namespace WebApplic.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
        {
            ThreadPool.QueueUserWorkItem(_ =>
            {
                throw new Exception("An error occurred.");
            });
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
}

Expected behavior The exception should be caught and handled appropriately, or at the very least, the documentation should clearly state that unhandled exceptions in ThreadPool.QueueUserWorkItem will cause the application to crash.

Screenshots N/A

Additional context This issue can lead to unexpected application crashes and loss of data. It is important to either handle the exception within the QueueUserWorkItem method or ensure that the documentation clearly states this behavior to prevent such issues.

Environment:

  • OS: [e.g., Windows 11]
  • .NET version: [e.g., .NET 8.0]
  • IDE: [e.g., Visual Studio 2022]

Please update the documentation to reflect this behavior or provide a solution to handle exceptions in ThreadPool.QueueUserWorkItem without crashing the application.

Thank you.

Page URL

https://learn.microsoft.com/zh-cn/dotnet/api/system.threading.threadpool.queueuserworkitem?view=net-8.0&devlangs=csharp&f1url=%3FappId%3DDev17IDEF1%26l%3DZH-CN%26k%3Dk(System.Threading.ThreadPool.QueueUserWorkItem)%3Bk(TargetFrameworkMoniker-.NETFramework%2CVersion%253Dv4.7.2)%3Bk(DevLang-csharp)%26rd%3Dtrue

Content source URL

https://github.com/dotnet/dotnet-api-docs/blob/main/xml/System.Threading/ThreadPool.xml

Document Version Independent Id

e13ed79b-e212-1d7a-f939-6086b300a399

Platform Id

aa4d1ae9-7ae8-c1d8-6d31-f91535257631

Article author

@dotnet-bot

1257960069 avatar Mar 13 '25 12:03 1257960069

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp5
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ThreadPool.QueueUserWorkItem(state =>
            {
                throw new Exception("An error occurred.");
            });
            Console.WriteLine("Hello, World!");
            Console.ReadLine();
        }
    }
}

Maybe should recommand developer use Task.Run

1257960069 avatar Mar 13 '25 12:03 1257960069