Tek iş parçacıklı bir uygulamanız varsa, Ana işlevde basit bir deneme / yakalama kullanabilirsiniz, ancak bu, Ana işlevin dışında, diğer iş parçacıklarında (örneğin diğerlerinde belirtildiği gibi) atılabilecek özel durumları kapsamaz. yorum). Bu kod, Main'de işlemeye çalışmanıza rağmen bir özel durumun uygulamanın sonlandırılmasına neden olabileceğini gösterir (enter tuşuna basarsanız ve uygulamanın özel durum oluşmadan önce zarif bir şekilde çıkmasına izin verirseniz, ancak programın düzgün bir şekilde çıkmasına izin verirseniz, ancak çalışmasına izin verirseniz , oldukça mutsuz bir şekilde sona erer):
static bool exiting = false;
static void Main(string[] args)
{
try
{
System.Threading.Thread demo = new System.Threading.Thread(DemoThread);
demo.Start();
Console.ReadLine();
exiting = true;
}
catch (Exception ex)
{
Console.WriteLine("Caught an exception");
}
}
static void DemoThread()
{
for(int i = 5; i >= 0; i--)
{
Console.Write("24/{0} =", i);
Console.Out.Flush();
Console.WriteLine("{0}", 24 / i);
System.Threading.Thread.Sleep(1000);
if (exiting) return;
}
}
Uygulama çıkmadan önce başka bir iş parçacığının temizleme işlemi gerçekleştirmek için bir istisna attığına dair bildirim alabilirsiniz, ancak anlayabildiğim kadarıyla, bir konsol uygulamasından, özel durumu işlemezseniz uygulamayı çalışmaya devam etmeye zorlayamazsınız Uygulamanın .NET 1.x ile olduğu gibi davranmasını sağlamak için bazı uyumsuzluk seçenekleri kullanmadan atıldığı iş parçacığında. Bu kod, ana iş parçacığının diğer iş parçacıklarından gelen özel durumlardan nasıl haberdar edileceğini gösterir, ancak yine de mutsuz bir şekilde sonlandırılır:
static bool exiting = false;
static void Main(string[] args)
{
try
{
System.Threading.Thread demo = new System.Threading.Thread(DemoThread);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
demo.Start();
Console.ReadLine();
exiting = true;
}
catch (Exception ex)
{
Console.WriteLine("Caught an exception");
}
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Console.WriteLine("Notified of a thread exception... application is terminating.");
}
static void DemoThread()
{
for(int i = 5; i >= 0; i--)
{
Console.Write("24/{0} =", i);
Console.Out.Flush();
Console.WriteLine("{0}", 24 / i);
System.Threading.Thread.Sleep(1000);
if (exiting) return;
}
}
Benim görüşüme göre, bir konsol uygulamasında işlemek için en temiz yolu , her iş parçacığının kök düzeyinde bir özel durum işleyicisi olmasını sağlamaktır:
static bool exiting = false;
static void Main(string[] args)
{
try
{
System.Threading.Thread demo = new System.Threading.Thread(DemoThread);
demo.Start();
Console.ReadLine();
exiting = true;
}
catch (Exception ex)
{
Console.WriteLine("Caught an exception");
}
}
static void DemoThread()
{
try
{
for (int i = 5; i >= 0; i--)
{
Console.Write("24/{0} =", i);
Console.Out.Flush();
Console.WriteLine("{0}", 24 / i);
System.Threading.Thread.Sleep(1000);
if (exiting) return;
}
}
catch (Exception ex)
{
Console.WriteLine("Caught an exception on the other thread");
}
}
Console.ReadLine()
(program akışını veya herhangi bir başka rahatsızlığı olmadan . Ama elde ettiğim şey, tekrar tekrar ve tekrar tekrar yükselterek istisnadır.