问题标签 [system.threading.channels]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1593 浏览

c# - 等待来自永无止境任务的事件的异步

目前我正在构建一个需要等待传入消息的网络服务器,但我需要异步等待这些消息。这些消息在另一个继续运行的任务中接收。无休止的任务推送事件,另一个任务也需要等待这些事件之一被接收。

如果需要更好地可视化问题,如果将绘制草图

我已经看到了 TaskCompletionSource 类,但是除非客户端断开连接,否则该任务将无法完成,因此这将无法正常工作。等待的任务是完全一样的。

是否有适用于 C#/.net 核心的库或内置解决方案?

谢谢 :)

0 投票
1 回答
183 浏览

c# - 两个对象集合之间有争议的并行工作

我正在尝试异步和并行模拟两个集合之间的工作,我有一个 ConcurrentQueue 的客户和一个工人的集合。我需要工作人员从队列中带走一个客户对客户执行工作,一旦完成就立即带走另一个客户。

我决定使用基于事件的范例,其中工人集合将对客户执行操作;谁拥有一个在客户完成后触发的事件处理程序;这有望再次触发 DoWork 方法,这样我就可以并行化工作人员以从队列中获取客户。但我不知道如何在 OnCustomerFinished() 中将客户传递给 DoWork!工人显然不应该依赖客户队列

// 编辑 - 这是客户类

0 投票
0 回答
95 浏览

asp.net-core - ChannelReader 之间的区别和 IAsyncEnumerable

我会保持这个简短

阅读文章“在 ASP.NET Core SignalR 中使用流式传输”(第一部分,服务器到客户端流式传输)后,ChannelReader[T]IAsyncEnumerable[T]有什么区别?

0 投票
3 回答
137 浏览

c# - 在并行运行 2 个或更多任务时保留变量值

我正在使用计时器,并已将线程作为解决问题的第一步。我必须每 30 秒发送一次参考,每次单击按钮时都会创建此参考。所以我有以下代码:

以下是 MyReference 类:

编辑问题重点:

问题是它只发送最新的值someReference而忽略以前的值。如何在 30 秒后发送每个值而不用 someReference 的最新值替换它们?

0 投票
3 回答
5030 浏览

c# - 是否可以和/或建议在一个对象中使用多个 System.Threading.Channels?

我正在开发一个 .net core 3.0 Web 应用程序,并决定在单例服务中使用 System.Threading.Channels。我的作用域请求服务的顶层注入这个单例来访问它的通道。

我决定使用这种模式将请求(为其他连接的客户端生成实时更新)与这些更新的执行分离。

在对象中实现 ONE 通道有很多例子。

谁能告诉我在我的单身人士中使用多个频道是否可能/可取?

创建多个通道并在创建单例时“启动”它们,我还没有遇到任何问题。我还没有达到可以测试多个客户端请求在单例上访问不同通道以查看它是否运行良好的地步。(或者根本没有?...)

我使用多个频道的主要动机是我希望单例根据频道中项目的类型做不同的事情。

我还希望永远不要“完成”这些渠道,并让它们在应用程序的整个生命周期内都可用。

0 投票
2 回答
340 浏览

c# - 任务上的无分配超时

我想为ChannelReader.ReadyAsync添加超时。这是我找到的两个解决方案:

但是,这两种解决方案都不是免分配的。第一个分配一个 CancellationTokenSource,第二个分配一个 Timer 在 Task.Delay 中。有没有办法在没有任何分配的情况下制作类似的代码?

编辑 1:使用第一个解决方案时的 dotTrace 输出 调用树 分配类型

0 投票
1 回答
180 浏览

c# - 什么可能 ChannelReader.ReadAny 实现是什么样的?

BlockingCollection<T>具有方便的静态 TakeFromAny方法,允许您使用多个集合“我想要这些集合中的任何一个中的下一个项目”。

ChannelReader<T>没有等价物,所以如果您确实想将多个通道消耗到一个流中 - 比如说将接收到的项目逐个打印到控制台 1,该怎么做?

0 投票
1 回答
1229 浏览

c# - 频道支持多个 ChannelReaders 和 ChannelWriters,还是只支持一个?

Channel.CreateUnbounded的文档说:

创建可供任意数量的读取器和写入器同时使用的无界通道。

但是Channel具有单个ChannelReaderChannelWriter唯一的属性,并且似乎没有一种方法可以围绕现有通道显式创建读取器/写入器。

我曾想过,如果您有多个生产者/消费者,他们应该共享同一个作者/读者实例,这是不正确的吗?“读者/作者的数量”是在谈论并发访问而不是类实例的数量吗?

0 投票
0 回答
122 浏览

c# - 使用 Channels 进行状态管理

我目前正在使用 Channels 构造(如 goroutine)来管理多线程状态同步。

我很好奇如何使用该通道处理状态管理的不同操作的最佳实践。一种操作可能是检索,另一种可能是从磁盘重新加载该状态。

在使用单个通道支持多个操作并为这些操作提供参数支持时,我感到相当多的摩擦和复杂性。特别支持不同的返回类型和该通道内每个操作决策路径内的转换。

有人可以推荐一些替代方法还是这个概念就足够了?

这是一个例子:

0 投票
1 回答
191 浏览

c# - 管道缓冲区保留直到处理完成

我正在研究使用管道处理来自网络的二进制消息的可能性。我将要处理的二进制消息带有一个有效负载,最好将有效负载保持为二进制形式。

这个想法是读出整个消息并创建一个消息片段及其有效负载,一旦消息被完全读取,它将被传递到通道链进行处理,处理不会是即时的,可能需要一些时间或被执行稍后,目标是不要让管道阅读器等到处理完成,然后一旦消息处理完成,我需要将处理后的缓冲区释放给管道编写器。

现在我当然可以创建一个新的字节数组并复制来自管道写入器的数据,但这会超出不复制的目的吗?所以据我了解,我需要管道和通道之间的一些缓冲区同步?我观察了管道阅读器的可用 api ( AdvanceTo ),它可以告诉管道阅读器消耗了什么以及检查了什么,但无法解决如何在管道读取方法之外同步它。

所以问题是是否有一些技术或例子来说明如何实现这一点。