我正在try 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...

Channel的编写者应该等待处理第一个值.但它反而失go 了第二个价值. 你能帮助我了解我错过了什么吗?

推荐答案

Console.WriteLine("Writing first value...");
writer.WriteAsync(7);

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

Csharp相关问答推荐

为什么在GuardationRule的收件箱函数中,decode.TryParse(valueString,out valueParsed)在给出1.0.1时返回true?

Microsoft. SQLServer. Types(106.1000.6)在try 从用户定义的类型检索值时引发异常

LINQ无法翻译SQLFunctions方法

我需要两个属性类吗

当我使用NET6作为目标框架时,为什么DotNet使用NET8作为MS包?

. NET 8控制台应用程序DI错误无法解析Microsoft. Extension. Logging. ILoggerFactory类型的服务'''

(乌龙)1&#比c#中的UL&#慢吗?

从ASP.NET Core中的枚举字段填充 Select 选项时,将默认的第一个选项添加为 Select 元素

我的MRG32k3a算法实现返回的数字超出了预期的[0,1]范围

C# CompareTo()和Compare()可以返回除-1和1以外的整数吗?

如何比较C#中的L和ł(波兰字符)返回TRUE

正确处理嵌套的本机集合

按需无缝转码单个HLS数据段

如何将%{v_扩展}转换为%{v_扩展}>>

Celler ArgumentExpression是否期望在所有情况下都捕获允许空值的运算符?

WPF动态设置弹出窗口水平偏移

是否可以在Entity Framework Core中使用只读 struct 作为拥有实体?

从GRPC连接创建ZipArchive

如何将行添加到DataGrid以立即显示它?

如何对构建在Clean架构和CQRS之上的控制器进行单元测试?