千家信息网

.NET多线程异常如何处理

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍了.NET多线程异常如何处理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。多线程应用,在实际的项目或产品开发中,原则上
千家信息网最后更新 2026年11月01日.NET多线程异常如何处理

这篇文章主要介绍了.NET多线程异常如何处理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

多线程应用,在实际的项目或产品开发中,原则上来说,应该尽量避免(这是我一家之言,因为我不是一个一心可多用的人 )。但是在强调用户体验的要求下或开发平台的限制下(如 Silverlight Socket 通讯),我们不得不用多线程。

多线程环境

在我们的产品 SE 中,出现多线程的地方主要有两大类,一类是通过 ThreadPool 或 new Thread 主动发起多线程,另一类是 Socket 通讯回调。

多线程异常捕获

对于一般的异常处理来说,我们只要简单的将可能出错的语句包含在 try/catch 语句中即可。我也曾经简单的将该方法运用于多线程的异常捕获,结果并非如此,代码如下:

public static void Main()   {   try {   new Thread (Go).Start();   }   catch (Exception ex)    {    // 永远执行不到这儿!    Console.WriteLine ("Exception!");    }   }    private static void Go()   {     throw null;   }

正确的做法应该是在新线程入口方法 Go 中捕获异常:

public static void Main()   {      new Thread (Go).Start();   }     private static void Go()    {      try   {          ...       throw null; // 该异常将会被捕获       ...      }      catch (Exception ex)      {           // 异常日志记录,或者通知其他线程出现异常了          ...       }    }

以上的正确做法来自 Threading in C# 中的小节 Exception Handling,该文涉及到 .NET 多线程的方方面面,是我看到最全***的文章。

正确捕获多线程异常的方法找到了,接下来我们自然会想:是不是每个线程入口方法都得这么做?

且看 Threading in C# 中的小节 Exception Handling 的描述:从 .NET 2.0 开始,任何一个线程上未处理的异常都会导致整个应用程序关闭。因此,在每个线程入口方法中都必须要使用 try/catch 语句,至少在产品应用程序中必须如此,以免应用程序因为我们未预料到的代码而关闭整个应用程序。

如果仅仅记下异常信息而不在乎应用程序异常关闭,那么有两个方法可以做到:

1、对于 Windows Form 程序来说,有一个全局异常处理事件:Application.ThreadException;

2、对于所有 .NET 程序来说,还有一个更低级的全局异常处理事件:AppDomain.UnhandledException;

更高的要求

我们能简单的通过全局异常处理事件来记录错误日志;如果保证不中断应用程序,也可以在每个线程入口方法中捕获异常并记录异常日志。有没有办法做到:既能捕获异常且不中断应用程序,又能如全局异常处理事件那样简单捕获异常?

对于主动创建的新线程,至少可以做到这一点:

public static class ThreadExecutor   {       public static bool Execute(System.Threading.WaitCallback callback, object state)     {          try         {               return System.Threading.ThreadPool.QueueUserWorkItem((data) =>            {                 try                {                       callback(data);                  }                  catch (exception ex)                   {                       // log the exception                   }              }, state);         }          catch (Exception e)          {             // log the exception          }         return false;     }    }

感谢你能够认真阅读完这篇文章,希望小编分享的".NET多线程异常如何处理"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

线程 程序 应用 应用程序 方法 处理 事件 入口 全局 篇文章 产品 日志 语句 主动 代码 做法 小节 是在 通讯 C# 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 有格互联网科技 广东猪兼强互联网科技有限公司 新华互联网科技学校 苏州互联网科技贷款公司 佰商互联网科技有限公司 中国互联网有什么科技含量 承德科技产业互联网发展 晓花互联网科技有限公司网址 阿大互联网科技有限公司 996高科技互联网公司 西安小鹰速贷互联网科技有限公司 互联网科技的全部知识 互联网科技公司营业执照怎么办理 元气玛特互联网科技公司是外包吗 中国互联网有什么科技 工业互联网科技创业 互联网科技大会大佬 数字科技和互联网金融哪个好 青岛互联网科技园 互联网科技创业计划的风险分析 亿人帮互联网科技有限公司 互联网络科技有限公司 天津摩尔互联网科技 无线互联网科技 互联网科技视频素材 科技类的互联网平台 北京三清互联网科技 呼和浩特新华互联网科技学院 中国互联网有什么科技 数字科技和互联网金融哪个好
0