问题标签 [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 投票
1 回答
623 浏览

asp.net-core - AspNetCore SignalR 流式澄清

我一直在浏览最近的 signalr 文档,偶然发现了名为Streaming的新功能。我也是,而且我设法让它与一个 JS 客户端一起运行。但是,我仍然不清楚何时使用它。

1-是否ChannelReader将数据流式传输到单个客户端?

2-如果是,与打电话有什么区别this.Clients.Caller.Invoke()

3-假设我正在收听外部实时馈送,例如证券交易所,是否建议使用信号流?

4-根据这篇文章,作者住在一个Task.Run()。那么,如果我需要使用流向 1000 个客户推送实时提要,这如何扩展?通常使用信号流是否存在任何可扩展性问题?

0 投票
1 回答
2267 浏览

asp.net-core-signalr - 如果连接断开,如何正确处理客户端流?

我正在使用 Microsoft.AspNetCore.SignalR 2.1 v1.0.4,并且使用 v1.0.4 的打字稿客户端正在使用 ChannelReader 流。

通道显示特定于单个实体的事件数据,因此当客户端的用户导航到该单个实体的页面呈现数据时,预计客户端将订阅通道。如果用户导航到相同的页面但针对不同的实体,则客户端将进行另一个订阅调用。

现在我的问题是关于如何最好地取消订阅流,一般来说,在集线器连接停止/启动场景下,流的生命周期对客户端来说是什么,以及服务器是否显式中止连接(由于 access_token 超时所以触发客户端刷新他们的连接)?

似乎没有从 api 显示一些连接状态,所以我目前使用 RxJs Subject 来显示我的 UI 组件/服务的一些连接状态,即当集线器连接的启动调用成功时,我显示“真”,当onclose 回调称为 I 表面“假”。这使我可以尝试在先前订阅的流上调用 dispose 以在连接断开/停止期间进行清理,然后在必要时在成功启动调用时再次调用订阅流。

我尝试在流上调用 dispose,如果集线器已连接,这很好,但如果连接处于断开状态,则会出错。我想知道这是否是一个错误。即使集线器断开连接,我也应该能够处理流吗?

可以只做一个delete streamsubscription然后根据需要重新创建,还是会以任何方式泄漏?

0 投票
1 回答
157 浏览

c# - _ = WriteItems(channel.Writer, count, delay);中的下划线是什么意思

我正在阅读有关 SignalR 的信息,并且找到了代码:

下划线是什么意思?它是可变的吗?

0 投票
1 回答
552 浏览

asp.net-core-signalr - 如何扩展 SignalR ChannelReader?

我正在使用 SignalR 1.0.4 并有一个集线器,该集线器返回一个 ChannelReader 从一个可观察的由扩展创建的。

打字稿客户端(也是 1.0.4)被迫仅使用 websockets 连接,并从该通道流式传输数据。

现在我正在使用 2 个集线器实例进行横向扩展测试,它们都使用相同的 Redis 连接。我在两个实例上都从通道的 observable 发出值,但客户端似乎只从它所连接的实例接收数据。我的结论是频道阅读器数据不会通过 Redis 广播到其他频道。

我尝试使用SignalRSamples通过复制项目并为副本提供不同的主机 IP 来模拟 2 个负载平衡实例来复制它。我将相同的 Redis 连接添加到两个项目并启动它们。

通过 hubs.html 的常规 websocket 连接在跨实例广播数据时没有问题。streaming.html 不会为可观察或通道阅读器复制数据。

频道阅读器是否打算以这种方式使用,即它们可以横向扩展吗?

0 投票
0 回答
172 浏览

.net - 使用具有不同 TRead/TWrite 的 System.Threading.Channels

通道使用静态方法CreateUnbounded<TType>CreateBounded<TType>. 创建的通道将接受写入并发出读取TType.

在我的用例中,我想要一个写入TType但发出的通道objects。看起来这是可能的,因为有一种类型Channel<TWrite, TRead>,所以基本上我想要一个Channel<TWrite, object>. 有没有办法让我创建这个实例?请看下面的截图

所需实例

0 投票
1 回答
1023 浏览

c# - ChannelReader.WaitToReadAsync时如何避免抛出InvalidOperationException?

我使用 System.Threading.Channels 编写了异步队列。但是当我运行程序进行测试时,随机抛出以下异常并停止工作线程。

如果异常被捕获并忽略,则代码正在运行。但是我想摆脱原因不清楚的错误。

这是我的环境和最少的代码。

  • TargetFramework = netcoreapp2.1
  • System.Threading.Channels 版本 = 4.5.0
0 投票
0 回答
160 浏览

c# - 如何将事件处理程序合并到带有信号器的流式应用程序中?

我知道 c# 和 asp.net 核心的基础知识,但是我需要一些有关事件处理程序的帮助。我正在尝试构建一个将推文流式传输到前端的 asp.net 核心应用程序。我使用 tweetinvi 库来获取推文和信号器来进行流式传输。

我在控制台应用程序中测试了 tweetinvi 并且它有效。我使用事件处理程序并在控制台上显示了推文流。同样的方法不适用于 asp.net 核心应用程序。但是,我设法将随机生成的数字流式传输到前端。所以我在前端的 js 代码和后端的流媒体集线器设置工作正常。

获取推文需要事件处理程序实现,以便在收到每条推文后对其进行流式传输。在调试器中,我看到了推文及其内容。但是行:await channelWriter.WriteAsync(tweet,cancellationToken); 不向前端发送字符串。前端后端没有错误。


我将流作为一个类变量并检查了哈希码,它具有相同的值。所以看起来流没有被丢弃和关闭。

在调试模式下,TweetReceived 操作被无限调用并生成新的推文,但 WriteAsync 方法什么也不做。

后来,在开始时,当创建频道时,我添加了

只是发送“ok”字符串。然而这个方法没有被执行,当

稍后调用。我觉得很奇怪为什么稍后调用 StartStream 时 WriteAsync 不起作用。删除 StartStream 使 WriteSync 工作得很好。

0 投票
0 回答
230 浏览

asp.net - 无法在 asp .net core signalR 中播放示例客户端到服务器流式传输示例

我正在研究 .NET 框架 4.6.1。我想将数据从打字稿客户端流式传输到我的服务。我从 这里获取了代码。这是服务端代码:

客户端:

我正在使用 ASP .NET 核心 signalR 库。这些是安装在服务器端的包:Microsoft.AspNetCore 1.1.0、Microsoft.AspNetCore.SignalR.Common 1.1.0、Microsoft.AspNetCore.SignalR.Core 1.1.0、Microsoft.AspNetCore.SignalR.PROtocols.MessagePack 1.1。 0

在客户端,我有最新的预览版。“@aspnet/signalr”:“3.0.0-preview6.19307.2”,“@aspnet/signalr-protocol-msgpack”:“3.0.0-preview6.19307.2”,

我尝试寻找合适的包来安装 ASP .NET 框架,但没有找到任何东西。此功能是否可用于 .NET 框架 4.6.1。

当我从客户端调用 UploadaStream 函数时。我收到一个错误,指出无法调用“UploadStream”函数。请告诉我要安装的软件包的正确设置。

0 投票
3 回答
579 浏览

c# - 如何实现并发执行队列类?

我需要有一个将在线程池中执行操作的类,但这些操作应该排队。例如:

当有人从他的线程中调用方法 1 时,他也可以调用方法 2 或方法 3,并且所有 3 个方法都可以同时执行,但是当用户对方法 1 或 2 或 3 进行另一个调用时,这一次线程池应该阻塞这些调用,直到旧的执行完成。

如下图所示:

https://ibb.co/dBDY6YZ

我应该使用渠道吗?

0 投票
1 回答
375 浏览

c# - 在使用 ChannelWriter 的 SignalR Core 中:如果出现异常,我是否需要调用 TryComplete 两次?

以下是 Microsoft在 ASP.NET Core SignalR中使用流式传输一文的摘录:

如果有异常,它会先调用 writer.TryComplete(ex),然后调用 writer.TryComplete()。换句话说,它两次调用 TryComplete(尽管重载不同)。

这是必要的吗?我应该在 writer.TryComplete(ex) 之后添加一个 return 语句以避免调用它两次吗?或者第二个 writer.TryComplete() 在调用前者之后是否有一些有意义的目的?