我计划在现有的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应用程序的主线程。
答案 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