-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathChannels.cs
36 lines (31 loc) · 1.08 KB
/
Channels.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Threading.Channels;
using System.Threading.Tasks;
class Channels : IRunnable
{
public async Task Run()
{
var unboundedChannelOptions = new UnboundedChannelOptions();
unboundedChannelOptions.SingleWriter = true;
var channel = Channel.CreateUnbounded<int>(unboundedChannelOptions);
var channelWriter = channel.Writer;
await Task.WhenAll(Task.Run(() => Produce(channelWriter, 1000)), Task.Run(() => Read(channel.Reader, "R1")), Task.Run(() => Read(channel.Reader, "R2")));
}
async Task Read(ChannelReader<int> reader, string readerName)
{
while(await reader.WaitToReadAsync())
{
var value = await reader.ReadAsync();
Console.Write($" {readerName}-{value} ");
}
}
async Task Produce(ChannelWriter<int> writer, int count)
{
for (int i = 0; i < count; i++)
{
await writer.WaitToWriteAsync();
await writer.WriteAsync(i).ConfigureAwait(false);
}
writer.Complete();
}
}