我该在哪里处理异步异常?

10

考虑以下代码:

class Foo {
    // boring parts omitted

    private TcpClient socket;

    public void Connect(){
        socket.BeginConnect(Host, Port, new AsyncCallback(cbConnect), quux);
    }

    private void cbConnect(IAsyncResult result){
            // blah
    }
}

如果在BeginConnect返回之后,cbConnect被调用之前socket抛出异常,那么它会在哪里弹出? 它是否被允许在后台抛出异常?

2个回答

8

这是一个异步委托异常处理的代码示例,来自msdn论坛。我认为对于TcpClient模式,处理方式应该是一样的。

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);
    }
  }
}

请注意,选项#1将阻塞线程直到操作完成。您也可以同步调用该方法。选项2是这里的正确选择... - Marc

4
如果接受连接的过程出现错误,将调用您的cbConnect方法。然而,要完成连接,您需要进行以下调用。
socket.EndConnection(result);

此时,BeginConnect 过程中的错误将通过抛出异常来体现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接