Вам не нужно использовать исключения или синхронный метод, вы можете просто передать другой IAsyncResult
(при условии, что это шаблон, который вы используете - если вы используете шаблоны событий или делегатов, вы бы все же сможет добиться чего-то подобного без исключения).
Вот простой пример этого, где мы используем фиктивный делегат для возврата в случае ошибки (в данном случае неверный идентификатор):
public class MyAsyncController : AsyncController
{
public IAsyncResult BeginFoo(int id, AsyncCallback callback, object state)
{
Action errorDelegate = () => ViewData["errors"] = "Invalid ID";
// Here's our validation check, return the error delegate if necessary
if (id <= 0) return errorDelegate.BeginInvoke(callback, state);
var webRequest = WebRequest.Create("http://www.apple.com");
return webRequest.BeginGetResponse(callback, webRequest);
}
public ActionResult EndFoo(IAsyncResult asyncResult)
{
if (asyncResult.AsyncState is WebRequest)
{
var webRequest = (WebRequest) asyncResult.AsyncState;
var httpResponse = (HttpWebResponse) webRequest.EndGetResponse(asyncResult);
ViewData["status"] = httpResponse.StatusCode;
}
return View();
}
}