WAIT 节流选项似乎不适用于通道

问题描述 投票:0回答:1

我正在尝试

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...

通道的编写器应该等待第一个值被处理。但它反而失去了第二个值。 你能帮我理解我错过了什么吗?

c# .net multithreading
1个回答
0
投票
Console.WriteLine("Writing first value...");
writer.WriteAsync(7);

WriteAsync
异步添加项目,这意味着当有界通道有可用空间时将添加该项目。您应该
await
WriteAsync
的调用,因为它们返回一个
ValueTask
,它将在添加项目时完成。在您的情况下,此任务很可能会在某种异常情况下完成,因为在
Complete
操作有机会完成之前通道是
WriteAsync
。由于您没有
await
执行任务,因此未观察到错误。

© www.soinside.com 2019 - 2024. All rights reserved.