У меня есть следующий код для запуска асинхронного вызова. Я пытаюсь захватить исключение таймаута базы данных и показать какое-то удобное для пользователя сообщение.
Но, поставив try, catch block in endInvoke, action
не выполняется. Я использую ASP.Net 4.0 и С# 4.0
Page.RegisterAsyncTask(new PageAsyncTask(new BeginEventHandler(beginMyMethod)
, new EndEventHandler(endMyMethod), new EndEventHandler(timeout => { })
, true, true));
Page.ExecuteRegisteredAsyncTasks();
затем
IAsyncResult beginMyMethod(object sender, EventArgs e, AsyncCallback cb, object state)
{
Action r = myMethod;
return r.BeginInvoke(cb, state);
}
void endMyMethod(IAsyncResult asyncResult)
{
try{
myObj.Property // gives object reference error, as it was not set, since DB timeout
}
catch(MyTimeoutException ex){
//it is not getting called
}
}
private void MyMethod()
{
try{
MyObject myObj= //making a database call causes DB time out error
}
catch(MyTimeoutException ex){
//it is getting called
}
}
Как использовать блок try catch в методах Page.RegisterAsyncTask
Примечание. Я хочу предотвратить ошибку ссылки объекта с тайм-аутом db и асинхронную работу
Вы говорите, что myObj.Property
приводит к NullReferenceException
. Почему вы ожидаете поймать его с помощью catch (MyTimeoutException)
?
Вы используете шаблон APM. Это требует вызова метода EndXxx
для получения результата операции, получения каких-либо исключений и потенциального выпуска ресурсов. Вызовите метод EndXxx
.
endXXX
.