C#多线程异常处理
C#的⼦线程的异常处理,直接上代码吧。
⾸先是Thread,下⾯这种情况程序会直接抛异常
static void Main(string[] args)
{
try
{
Thread th =new Thread(Th);
th.Start();
}
catch(Exception ex)
{
//此处永远不会被执⾏
Console.WriteLine("get ex in child thread");
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
static void Th()
{
string s =null;
int a = s.Length;
}
下⾯在⼦线程中添加异常捕捉:
static void Main(string[] args)
{
try
{
Thread th =new Thread(Th);
th.Start();
}
catch(Exception ex)
{
/
/此处永远不会被执⾏
Console.WriteLine("get ex in child thread");
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
static void Th()
{
try
{
string s =null;
int a = s.Length;
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
执⾏结果:
综上所述,使⽤Thread时,⼦线程的异常需要在⼦线程的内部⾃⾏处理,主线程⽆法捕获⼦线程的异常。下⾯来看看使⽤Task的情况
static void Main(string[] args)
{
try
{
Task t = Task.Run(()=>
{
string s =null;
int a = s.Length;
});
t.Wait();
}
catch(Exception ex)
{
Console.WriteLine("get ex in child thread");
Console.WriteLine($"the type of Exception is: {ex.GetType().Name}");
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
运⾏结果:
下⾯⽤异步函数的⽅式:
static async Task Main(string[] args)
{
try
writeline函数{
await Task.Run(async()=>
{
string s =null;
int a = s.Length;
await Task.Delay(100);
});
}
catch(Exception ex)
{
Console.WriteLine("get ex in child thread");
Console.WriteLine($"the type of Exception is: {ex.GetType().Name}");
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
看看运⾏结果:
由此可见使⽤Task和异步函数,可以对异常更加⽅便的处理,若使⽤Thread类创建的线程,则需要在⼦线程代码中处理异常。对异常进⾏合适的处理对于程序的健壮性有很⼤的好处,更重要的是当出现问题的时候可以快速定位到问题。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。