TPL异常 - 如何附加到主线程

时间:2016-01-19 17:31:50

标签: .net-4.0

我计划在现有的asp.net应用程序中实现TPL以提高性能。 我在选择性位置实现它们(比如将调用数据写入一个表以及某种不相关和非同步操作),我们正在处理global.asax文件中application_error事件中的所有未处理异常。

但是当我收到错误时,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来捕获优先权,有时会暂停应用程序,并且控件不会继续执行更多代码。

那么如何将TPL优先级附加到托管asp.net应用程序的主线程。

1 个答案:

答案 0 :(得分:0)

.Net中有一个可观察的集合ObservableCollection。如果我们打开的线程中有错误,如果我们在这个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