using System;
using System.Threading.Tasks;
using System.Threading.Channels;
class Program
{
static async Task Main(string[] args)
{
// 创建一个无缓冲的通道 (Channel)
Channel<int> channel = Channel.CreateUnbounded<int>();
// 启动一个生产者任务
Task producer = Task.Run(async () =>
{
for (int i = 0; i < 10; i++)
{
await channel.Writer.WriteAsync(i);
Console.WriteLine($"Produced: {i}");
await Task.Delay(100); // 模拟一些延迟
}
channel.Writer.Complete(); // 完成写入
});
// 启动一个消费者任务
Task consumer = Task.Run(async () =>
{
while (await channel.Reader.WaitToReadAsync())
{
while (channel.Reader.TryRead(out int item))
{
Console.WriteLine($"Consumed: {item}");
await Task.Delay(200); // 模拟处理时间
}
}
});
// 等待生产者和消费者完成
await Task.WhenAll(producer, consumer);
}
}
创建通道:
Channel<int> channel = Channel.CreateUnbounded<int>(); 创建了一个无缓冲的整数通道。你可以选择使用有界通道 (Channel.CreateBounded<T>(options)) 来限制通道中的项数。生产者:
Task.Run 启动一个异步任务来模拟生产者。await channel.Writer.WriteAsync(i) 将数据写入通道,并在每次写入后打印日志。channel.Writer.Complete() 标记写入操作已完成。消费者:
Task.Run 启动另一个异步任务来模拟消费者。await channel.Reader.WaitToReadAsync() 等待通道中有可用的数据,然后使用 channel.Reader.TryRead(out int item) 读取数据并处理。等待完成:
await Task.WhenAll(producer, consumer) 等待生产者和消费者任务都完成。这个示例展示了如何使用 C# 的 Channel 类来进行生产者-消费者模式的异步通信。
上一篇:c#指针
下一篇:c#时间戳转换日期格式输出
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站