千家信息网

.NET多线程异常如何处理

发表于:2024-11-30 作者:千家信息网编辑
千家信息网最后更新 2024年11月30日,这篇文章主要介绍了.NET多线程异常如何处理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。多线程应用,在实际的项目或产品开发中,原则上
千家信息网最后更新 2024年11月30日.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安全错误 数据库的锁怎样保障安全 惠普打印机网络安全有后门 南宫软件开发收费情况 计算机网络技术培训教材 施工时为了确保网络安全 北京广月朝辉互联网科技有限公司有什么作品 数据库sql如何查询交集 护苗.网络安全课堂六 宜兴高科技软件开发产品介绍 服务器如何装操作系统 服务器那个品牌好 阿里云国内外服务器互通 火车头采集器导入数据库 包头市零基础app软件开发 linux服务器日志在哪 大专的网络技术专业学什么 数据库查询各岗位员工人数 美团的软件开发人员 法院网络安全整改反馈 网信办网络安全保护 赚钱的app软件开发 软件开发模型的内在特征 重庆二手服务器回收选哪家云主机 软件开发技术人工智能 实用信息网络技术 摩拜单车云服务器 山西数据库防护箱现货 欧盟加强网络安全一揽子计划 嘉兴嵌入式软件开发流程 计算机网络技术要用什么电脑 宝塔数据库链接账号
0