Бросать исключение из AsyncCompletedEvent - PullRequest
0 голосов
/ 29 июля 2009

Можно ли вызвать исключение из события Completed асинхронного действия?

Моя ситуация такова, что я использую класс WebClient и выполняю асинхронную загрузку. Если обнаружена ошибка, я могу получить ее через AsyncCompletedEventArgs события WebClient.DownloadFileCompleted.

Однако то, что я действительно хочу сделать, - это затем добавить это исключение вверх по стеку в другие области кода, ожидающие завершения загрузки, так что нет необходимости сообщать пользователю об ошибке обратно. удалось на низком уровне.

Кто-нибудь знает, если / как это сделать? Как и в настоящее время, я получаю UnhandledException, потому что событие явно вызывается из внешнего кода.

Ответы [ 2 ]

2 голосов
/ 29 июля 2009

Если вы используете асинхронный режим, то другой код обычно не активно (или даже пассивно) ожидает завершения. Обратный вызов происходит в отдельном потоке, поэтому нет; Вы не можете действительно вызвать ошибку и заставить ее прервать ваш основной поток (ы).

Вам необходимо установить флаг, что произошло что-то плохое (возможно, включая экземпляр исключения), - и позволить другому коду запрашивать его, когда он выберет (хотя вы можете коснуться гейта / мьютекса / монитора, чтобы помочь уведомить другой поток) , Этот подход частично осуществляется с помощью подхода BackgroundWorker, где исходящий поток (при получении уведомления) может подобрать исключение.

1 голос
/ 20 февраля 2013

Если у вас есть статическая ссылка на Dispatcher, другой вариант - вызвать исключение в потоке пользовательского интерфейса:

Dispatcher.BeginInvoke(() => { throw new Exception("Example"); });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...