最近在学习使用委托和事件,大致情况如下。
利用委托来实现处理一组函数,而这些函数是通过事件注册的。现在我想在程序中看到运行的情况,比如实时显示程序当前运行那个具体的函数(被事件封装),不知道该如何下手。通过这个还能处理异常。确定程序异常在那个函数。不知道这么描述是否正确,还请指正。小弟才开始学习使用c#,实在有些不懂。完全没有c++的函数指针来的方便,呵呵。
利用委托来实现处理一组函数,而这些函数是通过事件注册的。现在我想在程序中看到运行的情况,比如实时显示程序当前运行那个具体的函数(被事件封装),不知道该如何下手。通过这个还能处理异常。确定程序异常在那个函数。不知道这么描述是否正确,还请指正。小弟才开始学习使用c#,实在有些不懂。完全没有c++的函数指针来的方便,呵呵。
void MyHandler(){
statsuLable.Text = "I am now in MyHandler";
// add your real work code here statsuLable.Text = "I am now leaving MyHandler";
}而异常捕获也只能在内部进行。如果是有志青年的话也可以看看AOP来做。
这个问题其实包含了三个角色: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
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.
是类型就可以实例化(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同构
{
...
}
先别太刻意、深入地去理解它了,用它吧,把它用到实处,就真正理解了!
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("!!!");
}
}
}
那么在定义事件的地方,通过捕获这些CustomEventArgs类的属性信息来显示到你的form上,或者你再定义一个代理,用于主动通知执行方法的变化以及处理结果(包括异常)。