私は複数の独立したプロセスを開始するプロジェクトに取り組んでいます。予期せず失敗した場合、他の人たちが影響を受けることなく継続するという点まで、私は彼らを孤立させたい。私はAppDomainsを使ってこれをテストするためにPOC(以下にペースト)を試みましたが、それでも親アプリケーション全体がクラッシュします。マルチスレッド未処理例外
私は間違ったアプローチをしていますか?もしそうなら、私は何をしていますか?そうでない場合、私は何を間違っているのですか?
class Program
{
static void Main(string[] args)
{
Random rand = new Random();
Thread[] threads = new Thread[15];
for (int i = 0; i < 15; i++)
{
AppDomain domain = AppDomain.CreateDomain("Test" + i);
domain.UnhandledException += new UnhandledExceptionEventHandler(domain_UnhandledException);
domain.
Test test = domain.CreateInstanceFromAndUnwrap(Assembly.GetExecutingAssembly().Location, "ConsoleApplication1.Test") as Test;
Thread thread = new Thread(new ParameterizedThreadStart(test.DoSomeStuff));
thread.Start(rand.Next());
Console.WriteLine(String.Format("Thread #{0} has started", i));
threads[i] = thread;
}
for (int i = 0; i < 15; i++)
{
threads[i].Join();
Console.WriteLine(String.Format("Thread #{0} has finished", i));
}
Console.ReadLine();
}
static void domain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Console.WriteLine("UNHANDLED");
}
}
public class Test : MarshalByRefObject
{
public void DoSomeStuff(object state)
{
int loops = (int)state;
for (int i = 0; i < loops; i++)
{
if (i % 300 == 0)
{
// WILL break
Console.WriteLine("Breaking");
int val = i/(i % 300);
}
}
}
}
EDIT
"テスト" クラスは非常に単純化されていることに注意してください。実際のインプリメンテーションは非常に複雑で、例外処理に非常に大きなギャップがあります。
私の編集をご覧ください。この場合のTestクラスはオーバーライドされています。例外処理にはギャップがある可能性が非常に高いため、結果的に私が解決しようとしている状況が発生します。 – Benny
エラー/例外処理に隙間がありません。堅牢なアプリケーションには間に合わないでしょう。また、より厳密なエラー/例外処理を行うと、リソースの使用を制御するのに役立ちます。あなたはスレッドが頻繁に死ぬことを望まない、あなたはあらゆる種類のリソースリークを取得し、プロセス自体が不安定になるでしょう。 –