Skip to content

.Net - 2. page

.NET Windows Forms C# 线程中的全局异常处理

csharplogo

异常处理

任何线程创建范围内try/catch/finally块,当线程开始执行便不再与其有任何关系。考虑下面的程序:

public static void Main() {
try {
       new Thread (Go).Start();
}
catch (Exception ex) {
       // 不会在这得到异常
       Console.WriteLine ("Exception!");
}

static void Go() { throw null; }
}

这里try/catch语句一点用也没有,新创建的线程将引发NullReferenceException异常。当你考虑到每个线程有独立的执行路径的时候,便知道这行为是有道理的,补救方法是在线程处理的方法内加入他们自己的异常处理:

public static void Main() {
      new Thread (Go).Start();
}

static void Go() {
try {
       ...
       throw null;         // 这个异常在下面会被捕捉到
       ...
}
catch (Exception ex) {
       记录异常日志,并且或通知另一个线程
       我们发生错误
       ...
}

从.NET 2.0开始,任何线程内的未处理的异常都将导致整个程序关闭,这意味着忽略异常不再是一个选项了。因此为了避免由未处理异常引起的程序崩溃,try/catch块需要出现在每个线程进入的方法内,至少要在产品程序中应该如此。对于经常使用“全局”异常处理的Windows Forms程序员来说,这可能有点麻烦,像下面这样:

using System;
using System.Threading;
using System.Windows.Forms;

static class Program {
static void Main() {
       Application.ThreadException += HandleError;
       Application.Run (new MainForm());
}

static void HandleError (object sender, ThreadExceptionEventArgs e) {
       记录异常或者退出程序或者继续运行...
}
}

Application.ThreadException事件在异常被抛出时触发,以一个Windows信息(比如:键盘,鼠标活着 “paint” 等信息)的方式,简言之,一个Windows Forms程序的几乎所有代码。虽然这看起来很完美,它使人产生一种虚假的安全感——所有的异常都被中央异常处理捕捉到了。由工作线程抛出的异常便是一个没有被Application.ThreadException捕捉到的很好的例外。(在Main方法中的代码,包括构造器的形式,在Windows信息开始前先执行)

.NET framework为全局异常处理提供了一个更低级别的事件:AppDomain.UnhandledException,这个事件在任何类型的程序(有或没有用户界面)的任何线程有任何未处理的异常触发。尽管它提供了好的不得已的异常处理解决机制,但是这不意味着这能保证程序不崩溃,也不意味着能取消.NET异常对话框。

 

.Net Framework 中相关技术简介

thCAM9N00B

Windows Workflow Foundation(WF):工作流引擎,基于工作流的开发使程序的业务逻辑与代码相分离,从而可以大大提高软件开发的效率。

Windows Communication Foundation(WCF): 用于实现应用程序间(包含不同语言开发的程序)通信的技术,WCF构建在SOAP协议之上。

Windows Presentation Foundation(WPF): 集成WebForm与WinForm于一体的界面开发方案

 

WPF的全称是Windows Presentation Foundation,是微软新发布的Vista操作系统的三大核心开发库之一,其主要负责的是图形显示,所以叫Presentation(呈现)。
作为新的图形引擎,WPF是基于DirectX的,当然增加了很多新的功能。其2D和3D引擎的强大看看Vista的界面就明白了,再加上其对Aero图形引擎的支持,更加让你刚到神奇。顺便提一下,Aero是专门为3D桌面开发的引擎,可以让桌面实现神奇的3D翻转,这绝对是操作系统有史以来的一次神奇尝试,虽然对硬件配置的要求也是惊人的,此前已有相关报道称,Vista对显卡十分挑剔就是出于运行Aero的考虑。

 

P.S. : WPF就是所谓下一代Windows界面层技术,就算是winform的下一代吧。

Windows通信基础(Windows Communication Foundation,WCF)是基于Windows平台下开发和部署服务的软件开发包(Software Development Kit,SDK)。WCF为服务提供了运行时环境(Runtime Environment),使得开发者能够将CLR类型公开为服务,又能够以CLR类型的方式使用服务。理论上讲,创建服务并不一定需要WCF,但实际上,使用WCF却可以使得创建服务的任务事半功倍。WCF是微软对一系列产业标准定义的实现,包括服务交互、类型转换、封送(Marshaling)以及各种协议的管理。

P.S. : 它整合了.Net平台下所有的和分布式系统有关的技术,例如ASP.NET Web服务(ASMX)、增强Web服务扩展(WSE)、.Net Remoting、企业服务(Enterprise Service)和微软消息队列(MSMQ)。你就先把它想成Web Service的下一代也没什么问题。

 

LINQ,语言集成查询(Language INtegrated Query)是一组用于c#和Visual Basic语言的扩展。它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据。

Continue reading

Excel 数字列名(序号)与字母列名(序号)的转换

2012年2月6日作者:enet

 

来自: http://www.tal-rasha.com/archives/254.html
写代码使用到的Excel索引间的转换,其实就是十进制和二十六进制间的转换

        /// <summary>
        /// 用于excel表格中字母转成索引,从1对应A开始
        /// </summary>
        /// <param name="column">号</param>
        /// <returns>索引</returns>
        private int ColumnToIndex(string column)
        {
            if (!Regex.IsMatch(column.ToUpper(), @"[A-Z]+"))
            {
                throw new Exception("Invalid parameter");
            }
            int index = 0;
            char[] chars = column.ToUpper().ToCharArray();
            for (int i = 0; i < chars.Length; i++)
            {
                index += ((int)chars[i] - (int)'A' + 1) * (int)Math.Pow(26, chars.Length - i - 1);
            }
            return index;
        }

        /// <summary>
        /// 用于将excel表格中索引转成字母,从A对应1开始
        /// </summary>
        /// <param name="index">索引</param>
        /// <returns>号</returns>
        private string IndexToColumn(int index)
        {
            if (index <= 0)
            {
                throw new Exception("Invalid parameter");
            }
            index--;
            string column = string.Empty;
            do
            {
                if (column.Length > 0)
                { index--;
                }
                column = ((char)(index % 26 + (int)'A')).ToString() + column;
                index = (int)((index - index % 26) / 26);
            } while (index > 0);
            return column;
        }

简单的加减乘除实例 C#

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace WinForm_p169_2
{
        /// <summary>
        /// Form2 的摘要说明。
        /// </summary>
        public class Form2 : System.Windows.Forms.Form
        {
                private System.Windows.Forms.ToolBar toolBar1;
                private System.Windows.Forms.ToolBarButton toolBarButton1;
                private System.Windows.Forms.ToolBarButton toolBarButton2;
                private System.Windows.Forms.ToolBarButton toolBarButton3;
                private System.Windows.Forms.ToolBarButton toolBarButton4;
                private System.Windows.Forms.Label label1;
                private System.Windows.Forms.Label label2;
                private System.Windows.Forms.TextBox textBox1;
                private System.Windows.Forms.TextBox textBox2;
                private System.Windows.Forms.StatusBar statusBar1;
                private System.Windows.Forms.StatusBarPanel statusBarPanel1;
                private System.Windows.Forms.StatusBarPanel statusBarPanel2;
                int a,b,x; // 运算所需的3个变量
                /// <summary>
                /// 必需的设计器变量。
                /// </summary>
                private System.ComponentModel.Container components = null;

                public Form2()
                {
                        //
                        // Windows 窗体设计器支持所必需的
                        //
                        InitializeComponent();

                        //
                        // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
                        //
                }

                /// <summary>
                /// 清理所有正在使用的资源。
                /// </summary>
                protected override void Dispose( bool disposing )
                {
                        if( disposing )
                        {
                                if(components != null)
                                {
                                        components.Dispose();
                                }
                        }
                        base.Dispose( disposing );
                }

                #region Windows 窗体设计器生成的代码
                /// <summary>
                /// 设计器支持所需的方法 - 不要使用代码编辑器修改
                /// 此方法的内容。
                /// </summary>
                private void InitializeComponent()
                {
                        this.toolBar1 = new System.Windows.Forms.ToolBar();
                        this.toolBarButton1 = new System.Windows.Forms.ToolBarButton();
                        this.toolBarButton2 = new System.Windows.Forms.ToolBarButton();
                        this.toolBarButton3 = new System.Windows.Forms.ToolBarButton();
                        this.toolBarButton4 = new System.Windows.Forms.ToolBarButton();
                        this.label1 = new System.Windows.Forms.Label();
                        this.label2 = new System.Windows.Forms.Label();
                        this.textBox1 = new System.Windows.Forms.TextBox();
                        this.textBox2 = new System.Windows.Forms.TextBox();
                        this.statusBar1 = new System.Windows.Forms.StatusBar();
                        this.statusBarPanel1 = new System.Windows.Forms.StatusBarPanel();
                        this.statusBarPanel2 = new System.Windows.Forms.StatusBarPanel();
                        ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).BeginInit();
                        ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel2)).BeginInit();
                        this.SuspendLayout();
                        //
                        // toolBar1
                        //
                        this.toolBar1.Buttons.AddRange(new System.Windows.Forms.ToolBarButton[] {
                                                                                                                                                                                this.toolBarButton1,
                                                                                                                                                                                this.toolBarButton2,
                                                                                                                                                                                this.toolBarButton3,
                                                                                                                                                                                this.toolBarButton4});
                        this.toolBar1.DropDownArrows = true;
                        this.toolBar1.Location = new System.Drawing.Point(0, 0);
                        this.toolBar1.Name = "toolBar1";
                        this.toolBar1.ShowToolTips = true;
                        this.toolBar1.Size = new System.Drawing.Size(292, 41);
                        this.toolBar1.TabIndex = 0;
                        this.toolBar1.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.toolBar1_ButtonClick);
                        //
                        // toolBarButton1
                        //
                        this.toolBarButton1.Tag = "+";
                        this.toolBarButton1.Text = "加";
                        //
                        // toolBarButton2
                        //
                        this.toolBarButton2.Tag = "-";
                        this.toolBarButton2.Text = "减";
                        //
                        // toolBarButton3
                        //
                        this.toolBarButton3.Tag = "*";
                        this.toolBarButton3.Text = "乘";
                        //
                        // toolBarButton4
                        //
                        this.toolBarButton4.Tag = "/";
                        this.toolBarButton4.Text = "除";
                        //
                        // label1
                        //
                        this.label1.Location = new System.Drawing.Point(27, 79);
                        this.label1.Name = "label1";
                        this.label1.Size = new System.Drawing.Size(63, 27);
                        this.label1.TabIndex = 1;
                        this.label1.Text = "第一个数";
                        //
                        // label2
                        //
                        this.label2.Location = new System.Drawing.Point(25, 133);
                        this.label2.Name = "label2";
                        this.label2.Size = new System.Drawing.Size(63, 27);
                        this.label2.TabIndex = 2;
                        this.label2.Text = "第二个数";
                        //
                        // textBox1
                        //
                        this.textBox1.Location = new System.Drawing.Point(94, 77);
                        this.textBox1.Name = "textBox1";
                        this.textBox1.Size = new System.Drawing.Size(129, 21);
                        this.textBox1.TabIndex = 3;
                        this.textBox1.Text = "0";
                        //
                        // textBox2
                        //
                        this.textBox2.Location = new System.Drawing.Point(92, 130);
                        this.textBox2.Name = "textBox2";
                        this.textBox2.Size = new System.Drawing.Size(129, 21);
                        this.textBox2.TabIndex = 4;
                        this.textBox2.Text = "0";
                        //
                        // statusBar1
                        //
                        this.statusBar1.Location = new System.Drawing.Point(0, 251);
                        this.statusBar1.Name = "statusBar1";
                        this.statusBar1.Panels.AddRange(new System.Windows.Forms.StatusBarPanel[] {
                                                                                                                                                                                  this.statusBarPanel1,
                                                                                                                                                                                  this.statusBarPanel2});
                        this.statusBar1.ShowPanels = true;
                        this.statusBar1.Size = new System.Drawing.Size(292, 22);
                        this.statusBar1.TabIndex = 5;
                        this.statusBar1.Text = "statusBar1";
                        //
                        // statusBarPanel1
                        //
                        this.statusBarPanel1.Text = "结果";
                        //
                        // Form2
                        //
                        this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
                        this.ClientSize = new System.Drawing.Size(292, 273);
                        this.Controls.Add(this.statusBar1);
                        this.Controls.Add(this.textBox2);
                        this.Controls.Add(this.textBox1);
                        this.Controls.Add(this.label2);
                        this.Controls.Add(this.label1);
                        this.Controls.Add(this.toolBar1);
                        this.Name = "Form2";
                        this.Text = "Form2";
                        ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).EndInit();
                        ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel2)).EndInit();
                        this.ResumeLayout(false);

                }
                #endregion
                // 函数验证是否为数字
                public bool IsNumeric(string str)
                {
                        try
                        {
                                // 先判断是否为整形
                                Int32.Parse(str);
                        }
                        catch
                        {
                                // 在判断是否为浮点型
                                try
                                {
                                        Double.Parse(str);
                                }
                                catch
                                {
                                        return false;
                                }
                        }
                        return true;
                }

                // 运算函数
                public void NumOperation(string o)
                {
                        // 判断输入是否为空
                        if((textBox1.Text!=null)||(textBox2.Text!=null))
                        {
                                // 判断是否为数字
                                if(!IsNumeric(textBox1.Text)||!IsNumeric(textBox2.Text))
                                {
                                        this.textBox1.Text="0";
                                        this.textBox2.Text="0";
                                }
                                else
                                {
                                        // 转换输入的2个字符串为数字
                                        a=System.Convert.ToInt32(this.textBox1.Text);
                                        b=System.Convert.ToInt32(this.textBox2.Text);
                                        if(o=="+")
                                                x=a+b;
                                        if(o=="-")
                                                x=a-b;
                                        if(o=="*")
                                                x=a*b;
                                        if(o=="/")
                                                if(b==0)
                                                {
                                                        MessageBox.Show("除数不能为0!");
                                                        this.textBox2.SelectAll();
                                                }
                                                else
                                                        x=a/b;
                                        // 显示结果
                                        statusBarPanel2.Text=x.ToString();
                                }
                        }
                }

                private void toolBar1_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e)
                {
                        // 调用按钮
                        this.NumOperation(e.Button.Tag.ToString());
                }
        }
}