问题标签 [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.

0 投票
1 回答
148 浏览

c# - AsyncProducerConsumerQueue 的可观察包装器

AsyncProducerConsumerQueue<T>因此,我使用以下代码为 Stephen Cleary 创建了一个可观察的包装器。

我想知道这里是否有人知道我如何以更简单的方式做到这一点?

  • 是否可以在没有包装类的情况下编写它?
  • 是否可以防止将多个包装器应用于一个队列的错误?
  • 我可以让它在第一次订阅时连接而不是通过直接调用来连接Connect吗?如果是这样,这意味着什么?
  • 最后,你会怎么做?
0 投票
1 回答
847 浏览

c# - 使用 AsyncContext 遇到死锁代码

这是我的代码,我在我的库中使用AsyncEx试图绕过潜在的死锁,但我最终还是在那里:

我从命令行应用程序运行它,url连续使用多个不同的值调用它,但在一个大for循环中同步。如果有足够多的调用,它最终会死在它的轨道上。难道我做错了什么?

0 投票
1 回答
115 浏览

nito.asyncex - Nito.AsyncEx 的 AsyncProducerConsumerQueue 性能是否足以处理千兆字节?

AsyncProducerConsumerQueue<byte> (maxCount: 10*1024*204)旨在处理千兆字节的字节,还是有更好的方法来为千兆字节创建流队列?将一些大小的 byte[] 放入队列中会更好吗?

await Dequeue我打电话十亿次听起来很奇怪......

0 投票
2 回答
554 浏览

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 线程上,而控制台应用程序中的用户将让它发生在线程池上。

我错过了什么吗?

0 投票
2 回答
53 浏览

c# - 如何使用 AsyncEx 检查另一个线程是否在锁定部分内?

我刚刚开始使用Nito.AsyncEx包,AsyncLock而不是在锁定部分lock() { ... }中有调用的普通部分(因为我刚刚读到的充分理由async,你不能lock()在这种情况下使用)。这是我从 Hangfire 运行的一项工作。让我们称之为“工人”线程。

在另一个线程中,来自 ASP.NET 控制器,我想检查是否有一个线程当前正在锁定部分中执行。如果锁定部分中没有线程,那么我将通过 Hangfire 安排后台作业。如果锁定部分中已经有一个线程,那么我不想安排另一个线程。(是的,这可能听起来有点奇怪,但这是另一个故事)。

有没有办法使用Nito.AsyncEx对象来检查这个,或者我应该在锁定部分的开头设置一个标志并在最后取消它?

例如,我想这样做:

并从控制器调用的服务中使用我想象的方法IsSomeoneInThereNow()

但到目前为止,我只能看到如何使用单独的变量来做到这一点(想象_isAnybodyInHere是一个线程安全的 bool或者我使用Interlocked了):

并从控制器调用的服务中:

真的感觉应该有更好的方法。医生AsyncLock

您可以使用已取消的 CancellationToken调用 Lock 或 LockAsync 以尝试立即获取 AsyncLock 而无需实际进入等待队列。

但我不明白如何做到这一点,至少使用同步Lock方法。

0 投票
1 回答
90 浏览

nito.asyncex - Nito.AsyncEx.AsyncContext.Run 的正确用法

我正在使用来自Steven的名为AsyncEx的优秀库来帮助我逐步将旧代码库过渡到异步世界。

文档说..

当调用具有不同签名的方法时,我应该做什么..

或在调用中指定异步/等待?

或者,没关系吗?