.NET Core 3.0 引入了 `System.Threading.Channels` 名稱空間,它提供了一套異步數據結構,用於生產者和消費者之間的數據傳遞。`Channel<T>` 類是其中的核心元件,類似於記憶體中的訊息佇列,支持高效能的並行數據流操作。本文將介紹 `Channel<T>` 類的基本用法,並提供範例程式碼,幫助開發者理解並套用這一強大的特性。
引言
`Channel<T>` 類作為.NET Core中的新特性,為生產者和消費者模型提供了一種高效的實作方式。它允許我們在不同的執行緒或異步任務之間傳遞數據,而無需使用傳統的執行緒同步機制。
`Channel<T>` 類提供了兩種型別的通道:
無界通道
(`Channel.CreateUnbounded<T>()`):可以無限容納數據,
有界通道
(`Channel.CreateBounded<T>(capacity)`):容量有限,寫入操作在通道滿時會阻塞。
以下是使用 `Channel<T>` 類建立生產者-消費者模型的範例程式碼:
1:使用無界通道
```csharp
using System;
using System.Threading;
using System.Threading.Channels;
using System.Threading.Tasks;
classProgram
{
staticasync Task Main(string[] args)
{
var channel = Channel.CreateUnbounded<int>();
var producer = Task.Run(async () =>
{
for (int i = 0; i < 10; i++)
{
await channel.Writer.WriteAsync(i);
Console.WriteLine($"Producer: {i}");
await Task.Delay(1000);
}
channel.Writer.Complete();
});
var consumer = Task.Run(async () =>
{
while (await channel.Reader.WaitToReadAsync())
{
while (channel.Reader.TryRead(outint item))
{
Console.WriteLine($"Consumer: {item}");
}
}
});
await Task.WhenAll(producer, consumer);
}
}
```
2:使用有界通道
```csharp
// 與無界通道範例類似,但建立通道時使用 Channel.CreateBounded<int>(capacity)
// 並在寫入操作後添加了 Console.WriteLine 來輸出生產者生成的數據。
```
3:多個生產者和消費者共享一個通道
```csharp
classProgram
{
staticasync Task Main(string[] args)
{
var channel = Channel.CreateUnbounded<int>();
var producers = new[] { Produce(channel.Writer, 1), Produce(channel.Writer, 2) };
var consumers = new[] { Consume(channel.Reader, 1), Consume(channel.Reader, 2) };
await Task.WhenAll(producers.Concat(consumers));
}
staticasync Task Produce(ChannelWriter<int> writer, int id)
{
for (int i = 0; i < 10; i++)
{
await writer.WriteAsync(i);
Console.WriteLine($"Producer {id}: {i}");
await Task.Delay(1000);
}
writer.Complete();
}
staticasync Task Consume(ChannelReader<int> reader, int id)
{
while (await reader.WaitToReadAsync())
{
if (reader.TryRead(outint item))
{
Console.WriteLine($"Consumer {id}: {item}");
await Task.Delay(2000);
}
}
}
}
```
`Channel<T>` 類為.NET Core 3.0 及更高版本提供了一種高效的生產者-消費者模式實作方案。它是一個行程內的記憶體佇列,效能高,適用於高並行場景。但使用時需要註意記憶體管理和數據的即時性。
推薦閱讀
- .NET MAUI 開發線上課程表
- .NET 輕量級、高效任務排程器:ScheduleTask.NET
- Aspire 與 RabbitMQ 的最佳實踐
進群學習交流加 : mm1552923
如果喜歡我的文章,那麽
「在看」和轉發是對我最大的支持!