खोज…


टिप्पणियों

उदाहरणों में प्रयुक्त पुस्तकालय

System.Threading.Tasks.Dataflow

System.Threading.Tasks

System.Net.Http

System.Net

पोस्ट और SendAsync के बीच अंतर

किसी ब्लॉक में आइटम जोड़ने के लिए आप Post या SendAsync उपयोग कर सकते हैं।

Post आइटम तुल्यकालिक जोड़ सकते हैं और एक वापसी करने की कोशिश करेंगे bool कह चाहे वह सफल रहा है या नहीं। यह तब सफल नहीं हो सकता है, उदाहरण के लिए, एक ब्लॉक अपनी BoundedCapcity तक पहुँच गया है और नई वस्तुओं के लिए अभी और कोई जगह नहीं है। दूसरी ओर SendAsync एक अपूर्ण Task<bool> लौटाएगा जिसका आप await कर सकते हैं। यह कार्य भविष्य में एक true परिणाम के साथ पूरा होगा जब ब्लॉक अपनी आंतरिक कतार को साफ़ कर देगा और अधिक आइटम स्वीकार कर सकता है या false परिणाम के साथ अगर यह स्थायी रूप से घट रहा है (जैसे कि रद्द होने के परिणामस्वरूप)।

एक्शनब्लॉक पर पोस्ट करना और पूरा होने की प्रतीक्षा करना

// Create a block with an asynchronous action
var block = new ActionBlock<string>(async hostName =>
{
    IPAddress[] ipAddresses = await Dns.GetHostAddressesAsync(hostName);
    Console.WriteLine(ipAddresses[0]);
});

block.Post("google.com"); // Post items to the block's InputQueue for processing
block.Post("reddit.com");
block.Post("stackoverflow.com");

block.Complete(); // Tell the block to complete and stop accepting new items
await block.Completion; // Asynchronously wait until all items completed processingu

पाइप लाइन बनाने के लिए ब्लॉक को जोड़ना

var httpClient = new HttpClient();

// Create a block the accepts a uri and returns its contents as a string
var downloaderBlock = new TransformBlock<string, string>(
    async uri => await httpClient.GetStringAsync(uri));

// Create a block that accepts the content and prints it to the console
var printerBlock = new ActionBlock<string>(
    contents => Console.WriteLine(contents));

// Make the downloaderBlock complete the printerBlock when its completed.
var dataflowLinkOptions = new DataflowLinkOptions {PropagateCompletion = true};

// Link the block to create a pipeline
downloaderBlock.LinkTo(printerBlock, dataflowLinkOptions);

// Post urls to the first block which will pass their contents to the second one.
downloaderBlock.Post("http://youtube.com");
downloaderBlock.Post("http://github.com");
downloaderBlock.Post("http://twitter.com");

downloaderBlock.Complete(); // Completion will propagate to printerBlock
await printerBlock.Completion; // Only need to wait for the last block in the pipeline

बफ़रब्लॉक के साथ सिंक्रोनस निर्माता / उपभोक्ता

public class Producer
{
    private static Random random = new Random((int)DateTime.UtcNow.Ticks);
    //produce the value that will be posted to buffer block
    public double Produce ( )
    {
        var value = random.NextDouble();
        Console.WriteLine($"Producing value: {value}");
        return value;
    }
}

public class Consumer
{
    //consume the value that will be received from buffer block
    public void Consume (double value) => Console.WriteLine($"Consuming value: {value}");
}

class Program
{
    private static BufferBlock<double> buffer = new BufferBlock<double>();
    static void Main (string[] args)
    {
        //start a task that will every 1 second post a value from the producer to buffer block
        var producerTask = Task.Run(async () =>
        {
            var producer = new Producer();
            while(true)
            {
                buffer.Post(producer.Produce());
                await Task.Delay(1000);
            }
        });
        //start a task that will recieve values from bufferblock and consume it
        var consumerTask = Task.Run(() => 
        {
            var consumer = new Consumer();
            while(true)
            {
                consumer.Consume(buffer.Receive());
            }
        });

        Task.WaitAll(new[] { producerTask, consumerTask });
    }
}

एक बाध्य बफ़रब्लॉक के साथ अतुल्यकालिक निर्माता उपभोक्ता

var bufferBlock = new BufferBlock<int>(new DataflowBlockOptions
{
    BoundedCapacity = 1000
});

var cancellationToken = new CancellationTokenSource(TimeSpan.FromSeconds(10)).Token;

var producerTask = Task.Run(async () =>
{
    var random = new Random();

    while (!cancellationToken.IsCancellationRequested)
    {
        var value = random.Next();
        await bufferBlock.SendAsync(value, cancellationToken);
    }
});

var consumerTask = Task.Run(async () =>
{
    while (await bufferBlock.OutputAvailableAsync())
    {
        var value = bufferBlock.Receive();
        Console.WriteLine(value);
    }
});

await Task.WhenAll(producerTask, consumerTask);


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow