委托 - 异常不要等到调用EndInvoke()

时间:2012-08-09 11:39:34

标签: c# exception delegates

我有这段代码:

using System;
using System.Runtime.Remoting.Messaging;

class Program {
    static void Main(string[] args) {
        new Program().Run();
        Console.ReadLine();
    }

    void Run() {
        Action example = new Action(threaded);
        IAsyncResult ia = example.BeginInvoke(new AsyncCallback(completed), null);
        // Option #1:
        /*
        ia.AsyncWaitHandle.WaitOne();
        try {
          example.EndInvoke(ia);
        }
        catch (Exception ex) {
          Console.WriteLine(ex.Message);
        }
        */
    }

    void threaded() {
        throw new ApplicationException("Kaboom");
    }

    void completed(IAsyncResult ar) {
        // Option #2:
        Action example = (ar as AsyncResult).AsyncDelegate as Action;
        try {
            example.EndInvoke(ar);
        }
        catch (Exception ex) {
            Console.WriteLine(ex.Message);
        }
    }
}

在许多文章中,当我致电BeginInvoke时,所有Exception s(此处来自方法threaded)都会等到我致电EndInvoke并将被抛到那里。但它不起作用,Exception(" Kaboom")是未经处理的"程序崩溃了。 你能救我吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

工作正常。当你说“和程序崩溃”时,我想知道你是否只是将IDE设置为中断所有异常。我没有崩溃 - 它正如我们所期望的那样将“Kaboom”写入控制台。尝试在IDE外部运行它或按 ctrl + f5 而不是 f5

我认为您只是看到IDE“有帮助”:

enter image description here

忽略这一点; IDE并不总是正确的。这仍然是处理。