Ho un'idea del perché, ma mi piacerebbe chiedere se qualcuno ha una buona comprensione del motivo per cui l'eccezione sollevata all'interno di un thread non viene mai catturata dal codice che l'ha avviato. Ecco qualche codice molto semplice per dimostrare quello che voglio dire:Try/Catch and threading
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);
}
}
}
}
ho ingenuamente pensato che avendo il try/catch vorrei essere al sicuro, ma ho trovato il modo rigido che non è il caso (è crash uno dei miei servizi).
Strano, stavo per iniziare un thread simile proprio ora. –
Sono sicuro che le Eccezioni hanno avuto bolle sul thread chiamante. Altrimenti non sto usando ThreadPool. solo Thread T = new Thread (new ThreadStart (delegate() {Console.WriteLine ("Crash!"); DoCrashyThingy();})); T.Start(); – Fusspawn
Potrei facilmente sbagliarmi, la maggior parte del mio lavoro è questo orribile single threaded behemoth .. – Fusspawn