दोनों ट्रांसफॉर्मब्लॉक पूर्ण होने पर कोड को पूरा करने के कोड को फिर से कैसे लिख सकता है? मैंने सोचा कि पूरा होने का मतलब है कि इसे पूर्ण चिह्नित किया गया है और "आउट कतार" खाली है?टीपीएल डेटाफ्लो, केवल पूरा होने की गारंटी जब सभी स्रोत डेटा ब्लॉक पूरा हो गए
public Test()
{
broadCastBlock = new BroadcastBlock<int>(i =>
{
return i;
});
transformBlock1 = new TransformBlock<int, string>(i =>
{
Console.WriteLine("1 input count: " + transformBlock1.InputCount);
Thread.Sleep(50);
return ("1_" + i);
});
transformBlock2 = new TransformBlock<int, string>(i =>
{
Console.WriteLine("2 input count: " + transformBlock1.InputCount);
Thread.Sleep(20);
return ("2_" + i);
});
processorBlock = new ActionBlock<string>(i =>
{
Console.WriteLine(i);
});
//Linking
broadCastBlock.LinkTo(transformBlock1, new DataflowLinkOptions { PropagateCompletion = true });
broadCastBlock.LinkTo(transformBlock2, new DataflowLinkOptions { PropagateCompletion = true });
transformBlock1.LinkTo(processorBlock, new DataflowLinkOptions { PropagateCompletion = true });
transformBlock2.LinkTo(processorBlock, new DataflowLinkOptions { PropagateCompletion = true });
}
public void Start()
{
const int numElements = 100;
for (int i = 1; i <= numElements; i++)
{
broadCastBlock.SendAsync(i);
}
//mark completion
broadCastBlock.Complete();
processorBlock.Completion.Wait();
Console.WriteLine("Finished");
Console.ReadLine();
}
}
मैंने कोड को संपादित किया, प्रत्येक ट्रांसफॉर्म ब्लॉक के लिए इनपुट बफर गिनती जोड़ दी। स्पष्ट रूप से सभी 100 आइटम प्रत्येक ट्रांसफॉर्म ब्लॉक में स्ट्रीम किए जाते हैं। लेकिन जैसे ही ट्रांसफॉर्मब्लॉक्स में से एक प्रोसेसरब्लॉक खत्म करता है, कोई और आइटम स्वीकार नहीं करता है और इसके बजाय अपूर्ण ट्रांसफॉर्मब्लॉक का इनपुट बफर केवल इनपुट बफर को फ्लश करता है।
सावधान रहें कि ट्रांसफ़ॉर्म ब्लॉक को प्रसारण ब्लॉक से सभी संदेश प्राप्त नहीं हो सकते हैं। उन्हें केवल _latest_ संदेश प्राप्त होता है। यदि प्रसारण ब्लॉक को ट्रांसफॉर्म ब्लॉक से तेज़ी से संदेशों की पेशकश की जाती है तो उन्हें प्राप्त कर सकते हैं, ट्रांसफॉर्म ब्लॉक संदेशों को याद करेगा। साथ ही, आपको 'SendAsync (i)' पर 'प्रतीक्षा' करना चाहिए यदि आप संदेश आदेश आदि सुनिश्चित करना चाहते हैं – urbanhusky