最近在学习使用委托和事件,大致情况如下。
利用委托来实现处理一组函数,而这些函数是通过事件注册的。现在我想在程序中看到运行的情况,比如实时显示程序当前运行那个具体的函数(被事件封装),不知道该如何下手。通过这个还能处理异常。确定程序异常在那个函数。不知道这么描述是否正确,还请指正。小弟才开始学习使用c#,实在有些不懂。完全没有c++的函数指针来的方便,呵呵。

解决方案 »

  1.   

    既然是新手,那么进度就只能让具体的函数来主动报告了
    void MyHandler(){
      statsuLable.Text = "I am now in MyHandler";
      
      // add your real work code here  statsuLable.Text = "I am now leaving MyHandler";
    }而异常捕获也只能在内部进行。如果是有志青年的话也可以看看AOP来做。
      

  2.   

    殊不知那些函数被封装成一个个的类,并注册在事件中。我如何在具体函数中报告当前状态呢?messagebox.show?原来的try catch在委托和事件引发处统一处理的,难道要按照你说的,在每一个类的具体函数里实现try catch?这样是不是效率也很低啊?
      

  3.   

    对了,1楼提到得AOP是个什么概念,全程怎么讲?
      

  4.   

    殊不知那些函数被封装成一个个的类,并注册在事件中。我如何在具体函数中报告当前状态呢?messagebox.show? 
    这个问题其实包含了三个角色:view,observable和observer。
    observable仅应负责事件的公开和触发。oberserver按需订阅事件。view如果希望获取当前状态,那么可以用同样的思路来做,observer变成一个新的observable,而原来的view则成为了新的observer。
    当然了最简单的做法是让observer拥有对view的引用,直接调用view提供的API来更新view。
    原来的try catch在委托和事件引发处统一处理的,难道要按照你说的,在每一个类的具体函数里实现try catch?这样是不是效率也很低啊?
    1.NO
    这是你应该做的做法
    2.如果在observable里面fire event的时候去try...catch,那么你只能通过System.Diagnostics.StackFrame之类的诊断类来获取上下文。
    3.当异常发生时,最好的恢复点就在于具体函数里。
    4.还是那句话,异常处理的职责不属于observable
      

  5.   

    再说一句,try...catch的开销并没有你想象的那么大。
    To run code in a try block isn't very expensive at all, the only expense worth considering comes when you enter the catch block. But considering in most cases you should never be entering the catch block its not really a problem. Just try to make sure you do any validation tests or checks you need to to avoid an exception beign thrown and you've no need to worry about the expense of using any try/catch blocks.
      

  6.   

    非常感谢cppfaq ,看样子有很多需要去进一步了解,比如你提到的observable和observer。我还是很模糊的对了,你提到的view引用一般怎么实现?
      

  7.   

    通过constructor/property/parameter等注入
      

  8.   

    改正版: 委托是一个类,它定义了方法的类型 
    是类型就可以实例化(new) 
    实例化的委托就是一个类似C++函数指针的东东! 事件是 触发机制 + 委托 是的一种应用!举例: C# code//定义一个委托
    public delegate object TMethodMode(object par);//函数模板类//应用
    TMethodMode myMedthod1 = new TMethodMode(this.RealMethod1);//指向类方法1
    object result = myMedthod1(obj);myMedthod2 = new TMethodMode(this.RealMethod2);//指向类方法2
    result = myMedthod2(obj);//类方法1
    public object RealMethod1(object par)//需与TMethodMode同构
    {
       ...
    }//类方法2
    public object RealMethod2(object par)//需与TMethodMode同构
    {
       ...
    }
    先别太刻意、深入地去理解它了,用它吧,把它用到实处,就真正理解了!
      

  9.   

    using System;
    using System.Collections.Generic;
    using System.Text;namespace ConsoleApplication25
    {
        class Program
        {
            static void Main(string[] args)
            {
                dele d = new dele(a);
                d += new dele(b);
                d += new dele(c);
                foreach (Delegate D in d.GetInvocationList())
                    try
                    {
                        Console.WriteLine("现在执行" + D.Method.Name);
                        D.DynamicInvoke(null);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message + ":" + e.InnerException.Message);
                    }
                Console.Read();
            }        delegate void dele();        static void a()
            {
                Console.WriteLine("a");
            }        static void b()
            {
                Console.WriteLine("b");
            }        static void c()
            {
                Console.WriteLine("c");
                throw new Exception("!!!");
            }
        }
    }
      

  10.   

    可以自定义一个继承自EventArgs的CustomEventArgs类,在类里面你提供一些属性信息来描述当前正在执行的方法,以及异常处理。
    那么在定义事件的地方,通过捕获这些CustomEventArgs类的属性信息来显示到你的form上,或者你再定义一个代理,用于主动通知执行方法的变化以及处理结果(包括异常)。