2011-07-14 11 views
10

मैं एक LINQ क्वेरी लिखने की कोशिश कर रहा हूं जो .NET ढांचे में प्रदान की गई CancellationToken तंत्र का उपयोग करके रद्दीकरण का समर्थन करेगा। हालांकि, यह स्पष्ट नहीं है कि रद्दीकरण और LINQ को गठबंधन करने का उचित तरीका क्या होगा।रद्द करने के साथ LINQ का उपयोग करने का उचित तरीका

PLINQ साथ

, यह लिखने के लिए संभव है:

var resultSequence = sourceSequence.AsParallel() 
            .WithCancellation(cancellationToken) 
            .Select(myExpensiveProjectionFunction) 
            .ToList(); 

दुर्भाग्य से, WithCancellation() केवल एक ParallelEnumerable पर लागू होता है - तो यह एक सादे पुराने LINQ क्वेरी के साथ नहीं किया जा सकता। यह एक अनुक्रमिक एक में एक समानांतर क्वेरी चालू करने के लिए WithDegreeOfParallelism(1) उपयोग करने के लिए, संभव है, ज़ाहिर है, - लेकिन यह स्पष्ट रूप से एक हैक है:

var resultSequence = sourceSequence.AsParallel() 
            .WithDegreeOfParallelism(1) 
            .WithCancellation(cancellationToken) 
            .Select(myExpensiveProjectionFunction) 
            .ToList(); 

मैं भी, जैसा कि मैंने जरूरत इस कार्रवाई के लिए एक अलग Task बनाने से बचना चाहते हैं इसे कई स्थानों पर करने के लिए, और मुझे कुछ मामलों में यह कोड नियंत्रित करने में सक्षम होना चाहिए।

तो, WithCancellation() के अपने कार्यान्वयन को लिखने से कम - क्या कोई विकल्प है जो एक ही चीज़ प्राप्त करेगा?

+1

मैं जानता हूँ कि इस सवाल का एक लंबे समय पहले से था, लेकिन क्या सिर्फ उपयोग करने के साथ गलत था 'AsParallel()। WithCancellation (cancellationToken)' और बस PLINQ हो दे? –

उत्तर

27

इस दृष्टिकोण के बारे में कैसे?

var resultSequence = sourceSequence.WithCancellation(cancellationToken) 
         .Select(myExpensiveProjectionFunction) 
         .ToList(); 

static class CancelExtention 
{ 
    public static IEnumerable<T> WithCancellation<T>(this IEnumerable<T> en, CancellationToken token) 
    { 
     foreach (var item in en) 
     { 
      token.ThrowIfCancellationRequested(); 
      yield return item; 
     } 
    } 
} 
+2

यह वास्तव में कनेक्ट पर एक सुविधा अनुरोध होने के योग्य है। –

+0

मैं समझने के लिए पर्याप्त नहीं हूं कि कोई प्रभाव है या नहीं, या यदि यह काम करता है या AsParallel() के साथ काम कर सकता है, लेकिन मुझे इस समाधान की सादगी पसंद है इसलिए मैं ऊपर उठ रहा हूं। –

+8

यदि मैं इसे वापस लौटा दूंगा। टेक.कॉइस (p_item =>! टोकन.इन्स कैनसेलेशन रिक्वेस्टेड); प्रदर्शन पर कोई प्रभाव डालेगा? – itsho

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