2010-12-07 8 views
7

मैंने कार्य का उपयोग करने का प्रयास किया है। Factory.ContinueWhenAll() केवल कुछ बार एक निरंतरता का आह्वान करने के इरादे से जब सभी पूर्ववर्ती किसी भी त्रुटि या रद्दीकरण के बिना पूरा होने के लिए दौड़ते हैं। ऐसा करने से एक ArgumentOutOfRangeException संदेश के साथ फेंक दिया करने के लिए कारण बनता है,क्या ए और बी के बाद कार्य सी जारी रखना संभव है बिना किसी टीपीएल विधि का उपयोग करके गलती या रद्दीकरण के पूरा होने के लिए?

यह कई कार्य के बंद निरंतरता के लिए विशिष्ट निरंतरता प्रकार बाहर करने के लिए अवैध है। पैरामीटर नाम: continuationOptions

उदाहरण के लिए, कोड

var first = Task.Factory.StartNew<MyResult>(
    DoSomething, 
    firstInfo, 
    tokenSource.Token); 
var second = Task.Factory.StartNew<MyResult>(
    DoSomethingElse, 
    mystate, 
    tokenSource.Token); 
var third = Task.Factory.ContinueWhenAll(
    new[] { first, second }, 
    DoSomethingNowThatFirstAndSecondAreDone, 
    tokenSource.Token, 
    TaskContinuationOptions.OnlyOnRanToCompletion, // not allowed! 
    TaskScheduler.FromCurrentSynchronizationContext()); 

TPL को स्वीकार्य नहीं है। क्या कुछ अन्य टीपीएल विधि का उपयोग करके ऐसा कुछ करने का कोई तरीका है?

उत्तर

4

ऐसा करने का कोई प्रत्यक्ष तरीका प्रतीत नहीं होता है। मैं बदलकर इसके बारे में प्राप्त कर चुका हूं केवलऑनरानो कॉम्प्लेशनकोई भी और यह देखने के लिए जांच कर रहा है कि अपवाद प्रत्येक कार्य निरंतरता में पारित होने के लिए शून्य नहीं है।

private void DoSomethingNowThatFirstAndSecondAreDone(Task<MyResult>[] requestTasks) 
{ 
    if (requestTasks.Any(t => t.Exception != null)) 
     return; 

    // otherwise proceed... 
} 

काम करता है की तरह कुछ है, लेकिन यह कई पूर्ववृत्त और पैटर्न एकल मामले Task.Factory.ContinueWith उपयोगों के साथ टूट के साथ मामले को संभालने के लिए एक बहुत ही संतोषजनक तरीका हो प्रतीत नहीं होता है।

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