我正在開發一個將啓動多個獨立進程的項目。我希望他們被隔離,以至於如果一個人意外失敗,其他人會繼續工作而不受影響。我嘗試過使用AppDomain測試這個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);
}
}
}
}
編輯
請注意, 「測試」 類極度簡化。實際的實現會非常複雜,並且在異常處理中可能存在很大的差距。
請參閱我的編輯。這種情況下的Test類過於簡化。異常處理很可能會有差距,這反過來會導致我正在努力解決的情況。 – Benny 2011-03-29 20:05:36
我會爲_not_拍攝錯誤/異常處理方面的空白,這將使一個強大的應用程序,但它聽起來像它會有一些成本。此外,更嚴格的錯誤/異常處理將幫助您控制資源使用情況。你不希望線程頻繁死亡,你會得到各種資源泄漏,然後進程本身會變得不穩定。 – 2011-03-29 20:44:54