namespace WpfGridChange { using System; using System.CodeDom.Compiler; using System.Diagnostics; using System.Windows; using System.Threading.Tasks; public class App : Application { [DebuggerNonUserCode, GeneratedCode("PresentationBuildTasks", "4.0.0.0")] public void InitializeComponent() { base.StartupUri = new Uri("../Resources/xaml/WinWellcome.xaml", UriKind.Relative); } protected override void OnStartup(StartupEventArgs e) { RegisterEvents(); base.OnStartup(e); } /// <summary> /// 注册事件 /// </summary> private void RegisterEvents() { //Task线程内未捕获异常处理事件 TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; //UI线程未捕获异常处理事件(UI主线程) this.DispatcherUnhandledException += App_DispatcherUnhandledException; //非UI线程未捕获异常处理事件(例如自己创建的一个子线程) AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; } private static void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e) { try { var exception = e.Exception as Exception; if (exception != null) { HandleException(exception); } } catch (Exception ex) { HandleException(ex); } finally { e.SetObserved(); } } //非UI线程未捕获异常处理事件(例如自己创建的一个子线程) private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { try { var exception = e.ExceptionObject as Exception; if (exception != null) { HandleException(exception); } } catch (Exception ex) { HandleException(ex); } finally { //ignore } } //UI线程未捕获异常处理事件(UI主线程) private static void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) { try { HandleException(e.Exception); } catch (Exception ex) { HandleException(ex); } finally { //处理完后,我们需要将Handler=true表示已此异常已处理过 e.Handled = true; } } private static void HandleException(Exception e) { MessageBox.Show("程序异常:" + e.Source + "\r\n@@" + Environment.NewLine + e.StackTrace + "\r\n##" + Environment.NewLine + e.Message); //记录日志 Utils.LogWrite(e); } [GeneratedCode("PresentationBuildTasks", "4.0.0.0"), DebuggerNonUserCode, STAThread] public static void Main()
{ App app = new App(); app.InitializeComponent(); app.Run(); } } }
Utils.LogWrite
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using System.Net; using System.Threading; namespace WpfGridChange { public class Utils { //读写锁,当资源处于写入模式时,其他线程写入需要等待本次写入结束之后才能继续写入 private static readonly ReaderWriterLockSlim LogWriteLock = new ReaderWriterLockSlim(); public static void LogWrite(Exception ex) { if (!Directory.Exists("Log")) { Directory.CreateDirectory("Log"); } var now = DateTime.Now; var logpath = @"Log\" + now.Year + "" + now.Month + "" + now.Day + ".log"; var log = "\r\n----------------------" + DateTime.Now + " --------------------------\r\n" + ex.Message + "\r\n" + ex.InnerException + "\r\n" + ex.StackTrace + "\r\n----------------------footer--------------------------\r\n"; try { //设置读写锁为写入模式独占资源,其他写入请求需要等待本次写入结束之后才能继续写入 LogWriteLock.EnterWriteLock(); File.AppendAllText(logpath, log); } finally { //退出写入模式,释放资源占用 LogWriteLock.ExitWriteLock(); } } } }
分类:
WPF
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2007-06-28 通过HttpWebResponse和HttpWebRequest 获取http地址上的图片
2007-06-28 C# 一个多线程操作控件的例子.#######