मैं प्रदर्शन में सुधार के लिए अपने मौजूदा एएसपीनेट एप्लिकेशन में टीपीएल लागू करने की योजना बना रहा हूं। मैं उन्हें चुनिंदा स्थानों पर लागू कर रहा हूं (जैसे एक टेबल पर डेटा लिखने के लिए कॉल और किसी प्रकार के अप्रासंगिक और गैर-सिंक संचालन), और हम Global.asax फ़ाइल में application_error ईवेंट में सभी हैंडल न किए गए अपवाद को संसाधित कर रहे हैं।

लेकिन जब मुझे कोई त्रुटि मिलती है तो टीपीएल उस त्रुटि को 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 के साथ प्रयास किया और कभी-कभी यह प्रशंसा को रोक देता है और नियंत्रण कोड की आगे की रेखा को आगे नहीं बढ़ा रहा है।

तो मैं टीपीएल उत्तेजना को मुख्य धागे से कैसे जोड़ सकता हूं जो एएसपीनेट एप्लिकेशन को होस्ट कर रहा है।

0
Ramesh 19 जिंदा 2016, 20:31

1 उत्तर

सबसे बढ़िया उत्तर

एक अवलोकन योग्य संग्रह ObservableCollection है जो .Net में उपलब्ध है। यदि हमारे द्वारा खोले गए थ्रेड में कोई त्रुटि है और यदि हम उन्हें इस ऑब्जर्वेबल कोलेक्शन में जोड़ते हैं, तो यह एक ईवेंट उठाएगा, उस ईवेंट से हम इस त्रुटि को संभाल सकते हैं

 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
0
Ramesh 14 अप्रैल 2016, 23:01