У меня есть приложение winforms, которое выполняет асинхронные вызовы WebClient с помощью процедур обратного вызова следующим образом ...
using (var wc = new WebClient())
{
wc.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted);
wc.DownloadProgressChanged+=new DownloadProgressChangedEventHandler(DownloadProgressCallback);
//other stuff
wc.DownloadFileAsync(uri, fullLocalPath);
}
Я хочу создать глобальный обработчик исключений, поэтому я определил для него событие приложения ...
[STAThread]
static void Main()
{
Application.ThreadException += new ThreadExceptionEventHandler(ApplicationThreadException);
//other stuff
Application.Exit();
}
private static void ApplicationThreadException(object sender, ThreadExceptionEventArgs e)
{
// Do logging or whatever here
Application.Exit();
}
Я считаю, что я прав, что ошибки приложения, вызванные событием Callback, не будут обнаружены Application.ThreadException? Так каков наилучший способ обеспечения обработки исключений обратного вызова?
Я видел в других сообщениях SO, что вы также можете создать обработчик для AppDomain.CurrentDomain.UnhandledException. Это лучший способ обработки исключений обратного вызова?
Я просто ищу рекомендации по использованию асинхронных обратных вызовов в приложении winforms.
EDIT
Николас ... спасибо за ваш ответ. Так что я могу поместить весь обратный вызов в попытку catch, а затем сделать бросок в catch. Или я должен явно проверить свойство AsyncCompletedEventArgs.error для ненулевого значения.
Если оно ненулевое ... вы можете сказать мне, как вызвать ошибку обратного вызова до моего глобального обработчика исключений?
Я думаю, я бы сделал это так ...
private void DownloadCompleted(object sender, AsyncCompletedEventArgs e)
{
if (e.Error != null)
{
throw e.Error;
}
if (DownloadHasCompleted == null) return;
File.Copy(this.RemoteIniFilePath, this.CurrentIniFilePath, true);
DownloadHasCompleted(this, e);
}
Сет