问题标签 [nito.asyncex]
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.
c# - AsyncProducerConsumerQueue 的可观察包装器
AsyncProducerConsumerQueue<T>
因此,我使用以下代码为 Stephen Cleary 创建了一个可观察的包装器。
我想知道这里是否有人知道我如何以更简单的方式做到这一点?
- 是否可以在没有包装类的情况下编写它?
- 是否可以防止将多个包装器应用于一个队列的错误?
- 我可以让它在第一次订阅时连接而不是通过直接调用来连接
Connect
吗?如果是这样,这意味着什么? - 最后,你会怎么做?
c# - 使用 AsyncContext 遇到死锁代码
这是我的代码,我在我的库中使用AsyncEx试图绕过潜在的死锁,但我最终还是在那里:
我从命令行应用程序运行它,url
连续使用多个不同的值调用它,但在一个大for
循环中同步。如果有足够多的调用,它最终会死在它的轨道上。难道我做错了什么?
nito.asyncex - Nito.AsyncEx 的 AsyncProducerConsumerQueue 性能是否足以处理千兆字节?
AsyncProducerConsumerQueue<byte> (maxCount: 10*1024*204)
旨在处理千兆字节的字节,还是有更好的方法来为千兆字节创建流队列?将一些大小的 byte[] 放入队列中会更好吗?
await Dequeue
我打电话十亿次听起来很奇怪......
c# - 可以为多个消费者缓存 IAsyncEnumerable 吗?
我正在研究用 IAsyncEnumerable 替换某些常规 C# 事件模式实例的效果。这将通过延迟实例化/激活 IAsyncEnumerable 并缓存该引用以供所有调用者/侦听器使用来完成。一些快速测试(见下文)表明这是可行的,但我还没有看到其他以这种方式使用 IAsyncEnumerable 的在线示例。
我意识到这并不是创建 IAsyncEnumerable 的目的,在这种情况下,大多数人会提倡 ReactiveX ( https://github.com/dotnet/reactive )。但是,我希望分析一下为什么要或不希望按照描述的方式执行此操作(而不仅仅是如何使用 Rx 执行此操作)。我在下面提供了几个例子。我的候选事件模式替换是一个事件流(例如从串行连接或 UDP 套接字等产生的反序列化消息)
示例 1:
这会产生我希望作为此模式的用户的输出:
前面的示例将每个使用者放在不同的线程上,但根据上下文(可能是 WPF 应用程序),同一线程上可能有多个使用者(IEnumerable 不可能,但使用 IAsyncEnumerable 打开门)。以下是在控制台应用程序中,但可以想象在 WPF 应用程序的 UI 线程上创建生产者和消费者。
示例 2:
同样,这是我作为用户想要的输出:
像这样的模式固有的一个好处是消费者/调用者可以让他们的回调/item-of-type-T-handling-code 出现在他们自己的 SynchronizationContext 中。SerialPort 或 Timer 或其他来源的事件通常会发生在后台线程上,而用户(尤其是在 UI 线程上)可能需要执行他们自己的同步。在这种情况下,UI 线程上的使用者总是可以让他们的代码发生在 UI 线程上,而控制台应用程序中的用户将让它发生在线程池上。
我错过了什么吗?
c# - 如何使用 AsyncEx 检查另一个线程是否在锁定部分内?
我刚刚开始使用Nito.AsyncEx包,AsyncLock
而不是在锁定部分lock() { ... }
中有调用的普通部分(因为我刚刚读到的充分理由async
,你不能lock()
在这种情况下使用)。这是我从 Hangfire 运行的一项工作。让我们称之为“工人”线程。
在另一个线程中,来自 ASP.NET 控制器,我想检查是否有一个线程当前正在锁定部分中执行。如果锁定部分中没有线程,那么我将通过 Hangfire 安排后台作业。如果锁定部分中已经有一个线程,那么我不想安排另一个线程。(是的,这可能听起来有点奇怪,但这是另一个故事)。
有没有办法使用Nito.AsyncEx
对象来检查这个,或者我应该在锁定部分的开头设置一个标志并在最后取消它?
例如,我想这样做:
并从控制器调用的服务中使用我想象的方法IsSomeoneInThereNow()
:
但到目前为止,我只能看到如何使用单独的变量来做到这一点(想象_isAnybodyInHere
是一个线程安全的 bool或者我使用Interlocked
了):
并从控制器调用的服务中:
真的感觉应该有更好的方法。医生AsyncLock
说:
您可以使用已取消的 CancellationToken调用 Lock 或 LockAsync 以尝试立即获取 AsyncLock 而无需实际进入等待队列。
但我不明白如何做到这一点,至少使用同步Lock
方法。