私はなぜ考えているのですか?誰かが、スレッド内で発生した例外が、それを開始したコードによって決して捕捉されない理由をよく把握しているかどうか尋ねたいと思います。ここで私が言いたいことを証明するためにいくつかの非常に単純なコードは次のとおりです。試してみる/キャッチとスレッディング
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);
}
}
}
}
(それがクラッシュし、私は単純のtry/catchを持っていることによって、私は安全だろうと思ったが、私はそれが当てはまらないというハードな方法を発見しました私のサービスの一つ)。
奇妙なことに、まさに今でも同様のスレッドを開始しようとしていました。 –
私は、例外が呼び出しスレッドにバブルアップしていることを確認しました。 AlthoはThreadPoolを使用していません。スレッドの新規スレッド(新しいThreadStart(delegate(){Console.WriteLine( "Crash!"); DoCrashyThingy();})); T.Start(); – Fusspawn
私は簡単にそれについて間違っている可能性があります、私の仕事のほとんどはこの恐ろしいシングルスレッドbehemoth .. – Fusspawn