2016-08-26 9 views
5

आदेश देने मैं Dataflow (Task Parallel Library) पढ़ रहा था, और वहाँ एक हिस्से को जो कहते हैं:समानता को समझना TPL Dataflow डिग्री

आप, समानांतरवाद है कि बड़े से कम 1, एक से अधिक संदेशों को एक साथ कार्रवाई की जाती है की एक अधिकतम डिग्री निर्दिष्ट करते हैं और इसलिए, संदेशों को उस क्रम में संसाधित नहीं किया जा सकता है जिसमें उन्हें प्राप्त किया जाता है। आदेश, जिसमें ब्लॉक से संदेश आउटपुट होते हैं, हालांकि, सही तरीके से आदेश दिया जाएगा।

इसका क्या अर्थ है? ब्लॉक में)

testActionBlock = new ActionBlock<int>(i => Consumer(i), 
      new ExecutionDataflowBlockOptions() 
      { 
       MaxDegreeOfParallelism = 5 
      }); 

await Producer(); 
testActionBlock.Completion.Wait(); 

मेरे निर्माता (मूल रूप से कतार संख्या:

उदाहरण के लिए, मैं समानांतरवाद की डिग्री = 5 के साथ मेरी कार्रवाई ब्लॉक सेट

private async Task Producer() 
{ 
    for (int i=0; i<= 1000; i++) 
    { 
     await testActionBlock.SendAsync(i); 
    } 
    testActionBlock.Complete(); 
} 

और मेरे उपभोक्ता (i) बस

private async Task Consumer(int i) 
{ 
    if (i == 1) 
    { 
     await Task.Delay(5000); 
    } 
    Console.WriteLine(i); 
} 

करता है इसका मतलब है कि उपभोक्ता (2) उपभोक्ता जब तक अवरुद्ध हो जाएगा (1) हा: लाइनों को लिखने एस प्रसंस्करण समाप्त हो गया है (क्योंकि 5 सेकंड देरी है)? मैंने कोड का परीक्षण किया और ऐसा लगता है कि यह मामला नहीं है। यहां तक ​​कि जब मैंने 5 सेकंड देरी को हटा दिया, तब भी मुझे आउटपुट क्रम में नहीं दिख रहा है।

[अपडेट]

bBlock = new BufferBlock<int>(option); 

testActionBlock = new ActionBlock<int>(i => Consumer(i), 
    new ExecutionDataflowBlockOptions() 
    { 
     MaxDegreeOfParallelism = 5 
    }); 

bBlock.LinkTo(testActionBlock); 

await Producer(); 
testActionBlock.Completion.Wait(); 

मेरे निर्माता() अब bBlock में जोड़ देगा:

private async Task Producer() 
{ 
    for (int i=0; i<= 1000; i++) 
    { 
     await bBlock.SendAsync(i); 
    } 
    bBlock.Complete(); 
} 

इसलिए, इस मामले में, उपभोक्ता (1) 5 सेकंड के लिए इंतजार करेंगे, उपभोक्ता (2) आगे बढ़ने से पहले?

उत्तर

3

सं डीओपी आप के धागे (ऐसा नहीं है लेकिन आसान तरीका यह सोचने के लिए) के रूप में

तो 5 में, यह एक समय में 5 कार्रवाई करने के लिए कोशिश करेंगे सोच सकते हैं। चूंकि # 1 5 सेकंड ले रहा है, # 2 निश्चित रूप से पहले खत्म हो जाएगा। संभावना है कि # 3, # 4, और # 5 होगा। शायद यहां तक ​​कि # 6 (चूंकि # 2 किया गया है, डीओपी इसे # 6 पर शुरू करने की अनुमति देगा)

बिना किसी देरी के, प्रसंस्करण के लिए कोई गारंटीकृत आदेश नहीं है। तो आदेश पर निर्भर न करें कि वे निष्पादित करें। ऐसा कहने पर, जब आप संदेश आउटपुट का उपयोग करते हैं (नहीं प्रेटिंटिंग, क्योंकि यह आदेश है कि वे निष्पादित करते हैं) वे क्रम में फिर से क्रमबद्ध किए जाएंगे, भले ही वे एक मनमानी क्रम में निष्पादित हों।

+0

स्पष्टीकरण के लिए धन्यवाद। लेकिन जब भी "संदेश आउटपुट ... फिर से क्रमबद्ध किया जाएगा" मैं अभी भी अस्पष्ट हूं। मैंने अपना मूल प्रश्न अपडेट किया है यह देखने के लिए कि क्या मेरी समझ सही है? – SimonSays

+0

टीपीएल डेटा प्रवाह ब्लॉक के अंदर और बाहर डेटा प्राप्त करने के लिए डिज़ाइन किया गया एक पूर्ण संदेश तंत्र प्रदान करता है। सटीक उदाहरणों के साथ एमएस से इस महान गाइड को देखें। https://msdn.microsoft.com/en-us/library/hh228597(v=vs.110).aspx – Tim

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