2011-02-10 12 views
5

मैं पहले भाग में विफल होने पर कार्य को जारी रखने से रोकने की कोशिश कर रहा हूं।कार्य रोकें। कॉन्फिन्यू अपवाद पर

मेरे कोड इस तरह दिखता है:

Task listener = Task.Factory.StartNew(openConnection).ContinueWith((t) => listenForNumber()); 

    void openConnection() 
    { 
     try 
     { 
      //stuff 
     } 
     catch 
     { 
      //morestuff 
     } 
    } 

    void listenForNumber() 
    { 
     //even more stuff 
    } 
अगर openConnection() कैच ब्लॉक

मैंने कोशिश की ContinueWith((t) => listenForNumber(),TaskContinuationOptions.NotOnFaulted);

लेकिन कोई सफलता, किसी भी मदद में प्रवेश करती है

अब listenForNuber() निष्पादित नहीं किया जाना चाहिए ? :(

धन्यवाद

+3

क्या आप उस पकड़-ब्लॉक के अंदर अपवाद को फिर से चलाते हैं या निगलते हैं? –

उत्तर

8

TaskContiuationOptions.NotOnFaulted जब तक आपके विधि गलती है कोई प्रभाव नहीं स्पष्ट रूप से होगा, यानी एक अपवाद इसके निष्पादन के दौरान फेंका बिना क्रिया गया था।

अपनी पकड़ ब्लॉक में, आप चाहिए अपवाद फिर से फेंक (और अपना काम करने के बाद throw; कथन का उपयोग करके throw; कथन का उपयोग करके) - अन्यथा अपवाद को फिर से नहीं फेंक दिया जाएगा, इसलिए आपकी विधि को 'दोषपूर्ण' नहीं माना जाएगा।

+0

ठीक है, लेकिन अगर मैं अपवाद को पुनर्स्थापित करता हूं तो इसे निगलने का सबसे अच्छा स्थान कहां है (और कैसे) तो मुझे उपयोगकर्ता कोड द्वारा एक समेकित निष्पादन या अपवाद नहीं मिला है? मुझे इसे फिर से संभालने की आवश्यकता नहीं है क्योंकि पहले कैच ब्लॉक में सब कुछ पहले से ही किया जा चुका है। – Ekoms

+0

@Ekoms: जहां तक ​​मुझे पता है, कुल मिलाकर एक्सेप्शन केवल तभी फेंक दिया जाता है जब आप कार्य की 'परिणाम' संपत्ति तक पहुंच रहे हों। जब आप अपवाद को निगल सकते हैं तो यह एक स्थान होना चाहिए, लेकिन सबसे पहले आपको यह जांचना चाहिए कि क्या वास्तव में यह अपवाद है कि आप निगलने का इरादा रखते हैं, न केवल कुछ अप्रत्याशित अपवाद। – ShdNx

1

आपको अपने कार्य विधि में अपवाद फेंकने की जरूरत है। टीपी एल नहीं जानता कि विधि विफल रही है, जब तक कि यह अपवाद नहीं ले लेता है।

आपको अभी भी दोषपूर्ण मामले के लिए निरंतरता विधि की आवश्यकता होगी। यह एक साधारण विधि हो सकती है जो अपवाद को लॉग करता है।

यदि आपके पास अपवाद के लिए निरंतरता विधि नहीं है, तो आपके कार्य विधि में अपवाद फेंकने पर आपको अपने एप्लिकेशन में अनचाहे अपवाद मिलेंगे।

2

एक विस्तार विधि सहायक बनाएँ।

public static void PropagateExceptions(this Task task) 
{ 
    if (task == null) 
     throw new ArgumentNullException("task"); 
    if (!task.IsCompleted) 
     throw new InvalidOperationException("The task has not completed yet."); 

    if (task.IsFaulted) 
     task.Wait(); 
} 

फिर किसी भी कोड को निष्पादित करने से पहले PropagateExceptions() एक्सटेंशन विधि को कॉल करें। अगर कार्य रद्द कर दिया गया तो प्रचार करें अपवाद() विधि भी पुनर्स्थापित हो जाएगी।

t1.ContinueWith(t => { 
    t.PropagateExceptions(); 
    listenForNumber(); 
}); 
संबंधित मुद्दे