The only difference I recently realized between ThreadPool.QueueUserWorkItem and Task.Run is the way they handle exceptions.
If an unhanded exception occurs inside ThreadPool.QueueUserWorkItem and is not handled by the global exception handler, the parent thread will crash. On the other hand, unused exceptions from the Task.Run thread Task.Run not propagate unless you await or Task.Wait .
source share