2015-04-24 2 views
1

Проверка лучшей практики здесь.thread pool error trapping

Я звоню в ThreadPool для запуска процесса Async, в частности, отправляя SSL-письмо с приложением, которое, кажется, занимает много времени.

Это всего лишь тестовый код, я думал, что я брошу это в Try Catch, просто что-то не сработает. Но будет ли поток когда-либо возвращаться сюда? Я проверил это закрытие веб-страницы, браузера, нажав кнопку «Назад» на странице. Электронная почта всегда делает это.

Try 
    System.Threading.ThreadPool.QueueUserWorkItem(AddressOf DoAsyncWork) ' 
Catch ex As Exception 
    Throw ex 
    Exit Sub 
End Try 

Я не пытаюсь вызвать сбой, но, я думаю, но я хотел бы знать, как лучше всего ловушку, если поток не удастся.

Protected Sub DoAsyncWork(ByVal state As Object) 
    Dim oMyObject As New sendSSLemail 
    oMyObject.SSL(userName, , strMessageBody, emailAdd, , permFileLocation, , "CodeMsg") 
End Sub 
+0

Из любопытства, какая версия рамки вы используете? – Cameron

+0

В чем смысл улавливания исключения, ничего не делая с ним, а затем реорганизовывая его, используя «Throw ex», который теряет трассировку стека исходного исключения? – Alex

+0

Шансы, что QUWI генерирует исключение, равны нулю. Вы должны иметь дело с ним в DoAsyncWork(). Это навсегда противно, огонь и забыть очень трудно справиться, исключения не позволят вам забыть. Подумайте о том, как использовать BackgroundWorker или Task, чтобы вы могли легко маршалировать неудачу обратно в поток пользовательского интерфейса. –

ответ

1

Более удобный способ сделать работу с пулом потоков состоит в использовании Task.Factory.StartNew(Action). Он возвращает объект Task, который может быть Await ed или заблокирован с помощью Wait.

После завершения задачи свойство Exception файла Task может использоваться, чтобы определить, было ли исключение вызвано и не обработано подпрограммой задачи. (Если это не Nothing, то InnerException свойство имеет реальное исключение, сброшенная.)

Dim task = Task.Factory.StartNew(AddressOf WorkFunction) 
' do stuff that doesn't depend on WorkFunction having completed 
task.Wait() 
If task.Exception IsNot Nothing Then Throw task.Exception.InnerException 

После Throw, саб вышел в любом случае (стек вызовов разматывается ищет Catch), поэтому Exit Sub утверждение ничего не делает. Обертка вызова QueueUserWorkItem в блоке try также не делает ничего, потому что любое исключение возникнет в другом потоке. Вы получите только исключения, которые сразу же могут быть отправлены QueueUserWorkItem, которые с моей головы включают только жалобы о том, что делегат Nothing.

Асинхронные задачи также могут возвращать значения. Для получения дополнительной информации об этом см. the TaskFactory methods that return a Func(Of Task).

+0

Отличный ответ, спасибо. Хотел бы я дать вам больше очков. это точное решение, в котором я нуждался. – htm11h