WPF系列学习

摘要:
1:WPF最小化到系统托盘2:WPF程序单例运行3:WPF中三种异常捕获:UI线程异常、非UI线程异常、Task线程异常在窗体放一个按钮在单击事件执行如下代码来模拟。

1:WPF最小化到系统托盘

2:WPF程序单例运行

3:WPF中三种异常捕获:UI线程异常、非UI线程异常、Task线程异常

在窗体放一个按钮在单击事件执行如下代码来模拟。

        private void Button_Click(objectsender, RoutedEventArgs e)
        {
            //throw new InvalidOperationException("Something has gone wrong.");
Thread t = new Thread(() => { throw new InvalidOperationException("Something has gone wrong."); });
            t.IsBackground = true;
            t.Start();

            //Task.Factory.StartNew(() => { throw new Exception("出错了"); });
        }

三种解决方案:

        private void App_Startup(objectsender, StartupEventArgs e)
        {
            //处理UI线程异常
            DispatcherUnhandledException +=App_DispatcherUnhandledException;
            //处理非UI线程异常
            AppDomain.CurrentDomain.UnhandledException +=CurrentDomain_UnhandledException;
            //Task线程内异常
            TaskScheduler.UnobservedTaskException +=TaskScheduler_UnobservedTaskException;
        }
        /// <summary>
        ///捕获到UI线程异常
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void App_DispatcherUnhandledException(objectsender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            log.Exception("捕获到UI线程异常", e.Exception);
            
            e.Handled = true;//表示此异常已处理过
        }
        /// <summary>
        ///捕获到非UI线程异常
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void CurrentDomain_UnhandledException(objectsender, UnhandledExceptionEventArgs e)
        {
            if(e.IsTerminating)
            {
                log.Error(string.Format("捕获到非UI线程异常,并发生致命错误,导致程序即将终止,请联系运营商!{0}", e.ExceptionObject.ToString()));
                MessageBox.Show("发生致命错误,导致程序即将终止,请联系运营商!");
            }
            else{
                log.Error(string.Format("捕获到非UI线程异常 {0}", e.ExceptionObject.ToString()));
            }
        }
        /// <summary>
        ///捕获到Task线程内异常
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TaskScheduler_UnobservedTaskException(objectsender, UnobservedTaskExceptionEventArgs e)
        {
            log.Exception("捕获到Task线程内异常", e.Exception);
            e.SetObserved();//设置该异常已察觉(这样处理后就不会引起程序崩溃)
        }

4:DataGrid 分页

免责声明:文章转载自《WPF系列学习》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【使用 DOM】使用事件Mysql --数据的增删改下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

libcurl多线程超时设置不安全

from http://blog.csdn.net/sctq8888/article/details/10031219 (1), 超时(timeout) libcurl 是 一个很不错的库,支持http,ftp等很多的协议。使用库最大的心得就是,不仔细看文档,仅仅看着例子就写程序,是一件危险的事情。我的程序崩溃了,我 怀疑是自己代码写的问题,后来发现是库没...

完美的外出上网解决方案随身随地享用你的专有WIFI网络(3G无线路由器+sim卡卡托+3G资费卡)

距离元旦和春节长假越来越近了,相信周围很多朋友肯定是打算趁着长假出去旅旅游。正好前几天跟一个朋友聊到在外面上网不方便的问题。因此我今天专门写一篇Blog来介绍一下我当时去西藏时的上网解决方案,供周围有类似外出需要上网的朋友参考。 正式介绍之前为了便于“小白”朋友的理解,我先介绍几个概念: 3G网络:具体的概念在这里我就不废话了,你只要STFG(Search...

MySQL主从复制的实现过程

一、什么是主从复制   将主数据库中的DDL和DML操作通过二进制日志传输到从数据库上,然后将这些日志重新执行(重做);从而使得从数据库的数据与主数据库保持一致。 基本原理:   MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。   MySQL复制是基于主服务器在二进制日志中跟踪所有对数据库的更改。因此,...

条件变量用例--解锁与signal的顺序问题

         我们知道,当调用signal/broadcast唤醒等待条件变量的其他线程时,既可以在加锁的情况下调用signal/broadcast,也可以在解锁的情况下调用。          那么,到底哪种情况更好呢?man手册中其实已经给出了答案:          The pthread_cond_broadcast() or pthread_...

1-多线程与多进程

  一 进程与线程的概念 1.1 进程 考虑一个场景:浏览器,网易云音乐以及notepad++ 三个软件只能顺序执行是怎样一种场景呢?假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源。你是不是已经想到在程序A读取数据的过程中,让程序B去...

跨线程调用控件

vs2005中默认是不允许跨线程调用控件的,否则会出错。但是也有解决办法: 以下内容为转贴 在VS 2005  中考虑到线程的安全性,不允许跨线程调用控件!  为了解决这一问题   1. 将Control 的 CheckForIllegalCrossThreadCalls 属性设置为假, 不去捕获错误线程的调用,但这种做法是不安全的! 2.使用委托异...