2012-09-24 14 views
7

मैं 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: 

मैं वहीं अपवाद संचालक है, तो मैं दुर्घटना को समझ नहीं पा रहा हूं। कोई विचार?

+0

मुझे आपके द्वारा वर्णित समस्या दिखाई नहीं दे रही है, 'पकड़' मेरे लिए ठीक काम करता है। क्या आप एक पूर्ण लेकिन संक्षिप्त कोड पोस्ट कर सकते हैं जो आपकी समस्या दिखाता है? – svick

+0

मुझे नहीं लगता कि ऐप क्रैश हो गया है, कम से कम इस अपवाद के साथ नहीं। या तो आपका ऐप क्रैश नहीं हुआ है (आप कैसे जानते हैं कि यह क्रैश हो गया है?), या यह आखिरी अपवाद नहीं है जो हो रहा है। – usr

+0

@usr हाँ, आप सही थे। मैं इसे डीबगर में चला रहा था और जब मैंने अपवाद को रनटाइम को रोक दिया, तो मुझे लगा कि यह एक अपवाद था जो ऐप को दुर्घटनाग्रस्त कर देगा। मुझे नहीं पता था कि कुछ अपवाद किसी को दुर्घटनाग्रस्त नहीं कर रहे हैं। – Doug

उत्तर

2

समस्या यह है कि po.CancellationToken.ThrowIfCancellationRequested(); स्पष्ट रूप से एक अपवाद फेंक रहा है, जो अनचाहे है। अपवाद हैंडलर Parrallel.ForEach() कॉल के आसपास हो सकता है लेकिन अपवाद को लैम्ब्डा अभिव्यक्ति के भीतर नहीं संभाला जाता है। या तो लाइन को हटा दें या लैम्ब्डा अभिव्यक्ति के भीतर एक अपवाद हैंडलर जोड़ें और इसे काम करना चाहिए।

अधिक जानकारी के लिए Cancelling a Task is throwing an exception देखें।

+0

तो, आप कह रहे हैं कि एमएसडीएन उदाहरण गलत है? – svick

+0

@svick संभवतः। मेरे द्वारा लिंक किए गए उत्तर पर एक नज़र डालें और जो भी सुझाव देता है उसे आजमाएं। अगर यह काम करता है, तो यह काम करता है। – akton

+0

@ कटन: मैंने लैम्बा अभिव्यक्ति के अंदर कोशिश/पकड़ डालने की कोशिश की और यह अभी भी रनटाइम त्रुटि में परिणाम देता है। – Doug

संबंधित मुद्दे