我正在尝试
System.Threading.Channels
。我注意到节流功能没有按照记录工作。这是一个非常简单的例子:
public class Example
{
private readonly Channel<int> queue = Channel.CreateBounded<int>(1);
public void Produce()
{
ChannelWriter<int> writer = queue.Writer;
Console.WriteLine("Writing first value...");
writer.WriteAsync(7);
Console.WriteLine("Writing second value...");
writer.WriteAsync(13);
Console.WriteLine("Finishing writing...");
writer.Complete();
}
public async Task Consume()
{
await Task.Delay(5000);
ChannelReader<int> reader = queue.Reader;
await foreach (int value in reader.ReadAllAsync())
Console.WriteLine(value);
Console.WriteLine("Done...");
}
}
这是我的运行方式:
var item = new Example();
var task1 = Task.Run(() => item.Produce());
var task2 = Task.Run(() => item.Consume());
Task.WaitAll(task1, task2);
这是我得到的结果:
Writing first value...
Writing second value...
Finishing writing...
7
Done...
通道的编写器应该等待第一个值被处理。但它反而失去了第二个值。 你能帮我理解我错过了什么吗?
Console.WriteLine("Writing first value...");
writer.WriteAsync(7);
WriteAsync
异步添加项目,这意味着当有界通道有可用空间时将添加该项目。您应该 await
对 WriteAsync
的调用,因为它们返回一个 ValueTask
,它将在添加项目时完成。在您的情况下,此任务很可能会在某种异常情况下完成,因为在 Complete
操作有机会完成之前通道是 WriteAsync
。由于您没有 await
执行任务,因此未观察到错误。