У меня есть идея, почему, но я хотел бы спросить, хорошо ли кто-то понимает, почему исключение, вызванное внутри потока, никогда не перехватывается кодом, который его запустил. Вот очень простой код, демонстрирующий, что я имею в виду:
using System;
using System.Collections.Generic;
using System.Threading;
namespace TestCrash
{
class Program
{
private static void Crash(object control)
{
AutoResetEvent are = (AutoResetEvent)(((object[])control)[0]);
are.Set();
throw new Exception("Burn baby burn");
}
static void Main(string[] args)
{
try
{
List<WaitHandle> waitHandles = new List<WaitHandle>();
for (int i = 0; i < 100; i++)
{
AutoResetEvent are = new AutoResetEvent(false);
waitHandles.Add(are);
object[] procControl = new object[] { are };
ThreadPool.QueueUserWorkItem(Crash, procControl);
WaitHandle.WaitAll(waitHandles.ToArray());
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
Я наивно думал, что, попробовав / поймав, я буду в безопасности, но я обнаружил, что это непросто (это сбой одного из моих сервисов).