Skip to content

Instantly share code, notes, and snippets.

@rodion-m
Created May 2, 2023 16:11
Show Gist options
  • Save rodion-m/1d140b21f9d8a7c0687151710edebebf to your computer and use it in GitHub Desktop.
Save rodion-m/1d140b21f9d8a7c0687151710edebebf to your computer and use it in GitHub Desktop.
Example of using Channels instead of lock (by ChatGPT)
using System;
using System.Threading.Channels;
using System.Threading.Tasks;
class Example
{
static async Task Main(string[] args)
{
var channel = Channel.CreateUnbounded<string>();
var producerTask = ProduceMessagesAsync(channel.Writer);
var consumerTask = ConsumeMessagesAsync(channel.Reader);
await Task.WhenAll(producerTask, consumerTask);
}
static async Task ProduceMessagesAsync(ChannelWriter<string> writer)
{
string[] messages = { "Message 1", "Message 2", "Message 3", "Done" };
foreach (var message in messages)
{
await writer.WriteAsync(message);
Console.WriteLine($"Produced: {message}");
}
writer.Complete();
}
static async Task ConsumeMessagesAsync(ChannelReader<string> reader)
{
await foreach (var message in reader.ReadAllAsync())
{
if (message == "Done")
{
Console.WriteLine("Consumer finished.");
break;
}
Console.WriteLine($"Consumed: {message}");
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment