Где я обрабатываю асинхронные исключения?

Рассмотрите следующий код:

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

Если socket выдает исключение после BeginConnect возвраты и прежде cbConnect назван, где это открывается? Даже позволяется бросить в фоновом режиме?

9
задан György Andrasek 15 June 2010 в 17:48
поделиться

2 ответа

Пример кода обработки исключений для асинхронного делегата с форума 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);
    }
  }
}
7
ответ дан 3 November 2019 в 00:58
поделиться

Если процесс принятия соединения приводит к ошибка будет вызван ваш метод cbConnect. Однако для завершения соединения вам необходимо выполнить следующий вызов

socket.EndConnection(result);

. В этот момент ошибка в процессе BeginConnect будет проявляться в генерируемом исключении.

4
ответ дан 3 November 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: