2016-01-19 4 views
0

Я планирую реализовать TPL в существующем приложении asp.net для повышения производительности. Я реализую их в выборочных местах (например, звонки для записи данных в одну таблицу и какие-то нерелевантные и несинхронические операции), и мы обрабатываем все необработанное исключение в событии application_error в файле global.asax.TPL Exception - Как подключиться к основной теме

Но когда я получаю сообщение об ошибке, TPL не бросает эту ошибку в событие application_error. Когда я попытался с Task.WaitAll(t1), то его бросание в событие app_error, но его время для обработки написанного кода. Но когда я пытаюсь использовать следующий метод (потребуется некоторое время только тогда, когда возникла ошибка), то и его не выбрасывание исключения в основной поток.

Task.Factory.StartNew(Sub(mainContext) 
             HttpContext.Current = mainContext 
             LookUpRepository.AddItems(CurrentContext.LoggedInUser.UserID, ClientID) 
            End Sub, HttpContext.Current).ContinueWith(Sub(tplException) 
                       For Each ex In tplException.Exception.InnerExceptions 
                        Throw ex 
                       Next 

                      End Sub, TaskContinuationOptions.OnlyOnFaulted Or TaskContinuationOptions.ExecuteSynchronously) 

Я попытался с ConcurrentQueue поймать exceotion и иногда останавливает applcation и контроль не идет дальнейший код.

Так как я могу прикрепить исключение TPL к основному потоку, на котором размещается приложение asp.net.

ответ

0

Существует наблюдаемая коллекция ObservableCollection, которая доступна в .Net. Если есть ошибка в потоке, который мы открыли, и если мы добавим их в этом ObservableCollection, то это поднимет событие, от этого события мы можем обрабатывать эту ошибку

Task.Factory.StartNew(Sub(mainContext) 
            'Using sw As StreamWriter = File.AppendText("c:/logs/t7.txt") 
            ' sw.WriteLine("thread=" + Thread.CurrentThread.ManagedThreadId.ToString()) 
            'End Using 
            HttpContext.Current = mainContext 
            'Do some operation 
           End Sub, HttpContext.Current).ContinueWith(Sub(tplException, subContext) 
                      HttpContext.Current = subContext 
                      If IsNothing(tplException.Exception) Then Exit Sub 
                      For Each ex In tplException.Exception.InnerExceptions 
                       MyAppState.Instance.ObservableException.Add(ex) 
                      Next 

                     End Sub, HttpContext.Current) 

Коллекции необходима заявленные

Public WithEvents ObservableException As ObservableCollection(Of Exception) 

событий, которые будут получать поднятые рамки .Net для обработки исключения

Private Sub CollectionChangedHandler(sender As Object, e As NotifyCollectionChangedEventArgs) Handles ObservableException.CollectionChanged 
    Dim ex = DirectCast(e.NewItems(0), Exception) 
    ExceptionLog.SaveFile(ExceptionLog.ReadExceptionInformationFromException(ex)) 
End Sub 
Смежные вопросы