Интересует, как правильно обрабатывать исключения при выполнении асинхронных операций в C#.
Например, из кода вызывается асинхронный метод IAsyncResult result = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
Допустим, обернули его в try… catch.
Далее, срабатывает Callback public static void ListenerCallback(IAsyncResult result)
{
}
Внутри этого метода тоже необходимо писать try… catch?
В каком случае исключении возникнет в первом блоке (контексте выполнения) и в каком во втором?
Но больше всего интересует конкретный вопрос: если например разорвётся коннект, в каком месте кода произойдёт исключение, и гарантированно ли будет вызван ListenerCallback? Просто в этом методе первым оператором нужно поместить команду, которая обязательно должна быть выполнена.
Оборачивать надо и BeginGetContext(если только в MSDN не написано что он не бросает исключений)
IAsyncResult result = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
и внутри колбека listener.EndGetContext(result), который выбросит исключение которое могло произойти внутри асинхронной операции.
Гарантию исполнения колбека дает тот кто реализует этот асинхронный паттерн. Т.е. можете считать что классы из базовой библиотеки всегда вызывают колбек, остальные должны, но не факт.