मैं Parallel.ForEach
लूप को रद्द करने की अनुमति देने का प्रयास कर रहा हूं। this MSDN article के अनुसार, यह संभव है, और मैं उनके कोडिंग का पालन कर रहा हूं।अनचाहे ऑपरेशन रद्द किए गए अपवाद को समानांतर से फेंक दिया गया। फोरेच
// Tokens for cancellation
ParallelOptions po = new ParallelOptions();
po.CancellationToken = cts.Token;
try
{
Parallel.ForEach(queries, po, (currentQuery) =>
{
// Execute query
ExecuteQuery(currentQuery);
// Throw exception if cancelled
po.CancellationToken.ThrowIfCancellationRequested(); // ***
});
}
catch (OperationCanceledException cancelException)
{
Console.WriteLine(cancelException.Message);
}
हालांकि, जब मैं एक उपयोगकर्ता के सुलभ समारोह से cts.Cancel();
फोन लाइन पर ऐप्लिकेशन क्रैश तारांकित त्रुटि के साथ ऊपर चिह्नित:
System.OperationCanceledException was unhandled by user code
Message=The operation was canceled.
Source=mscorlib
StackTrace:
at System.Threading.CancellationToken.ThrowIfCancellationRequested()
at CraigslistReader.SearchObject.<>c__DisplayClass7.<bw_DoWork>b__5(Query currentQuery) in {PATH}:line 286
at System.Threading.Tasks.Parallel.<>c__DisplayClass2d`2.<ForEachWorker>b__23(Int32 i)
at System.Threading.Tasks.Parallel.<>c__DisplayClassf`1.<ForWorker>b__c()
InnerException:
मैं वहीं अपवाद संचालक है, तो मैं दुर्घटना को समझ नहीं पा रहा हूं। कोई विचार?
मुझे आपके द्वारा वर्णित समस्या दिखाई नहीं दे रही है, 'पकड़' मेरे लिए ठीक काम करता है। क्या आप एक पूर्ण लेकिन संक्षिप्त कोड पोस्ट कर सकते हैं जो आपकी समस्या दिखाता है? – svick
मुझे नहीं लगता कि ऐप क्रैश हो गया है, कम से कम इस अपवाद के साथ नहीं। या तो आपका ऐप क्रैश नहीं हुआ है (आप कैसे जानते हैं कि यह क्रैश हो गया है?), या यह आखिरी अपवाद नहीं है जो हो रहा है। – usr
@usr हाँ, आप सही थे। मैं इसे डीबगर में चला रहा था और जब मैंने अपवाद को रनटाइम को रोक दिया, तो मुझे लगा कि यह एक अपवाद था जो ऐप को दुर्घटनाग्रस्त कर देगा। मुझे नहीं पता था कि कुछ अपवाद किसी को दुर्घटनाग्रस्त नहीं कर रहे हैं। – Doug