问题标签 [taskcompletionsource]

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 回答
84 浏览

c# - .NET TaskCompletionSource 任务何时有资格进行 GC(非 root)?

我正在为一些异步代码编写一个实用程序类,并且我想确保我不会在设计中造成内存泄漏。假设我的代码执行类似于下面的类。(显然你不会编写像这样工作的代码,但我有几个代码路径都汇聚成一个底层函数,其中一个代码路径有效地做到了这一点)。代码中的关键点是的代码中没有任何内容包含对 theTaskCompletionSource或其Task.

假设 Foo 实例是根据需要创建的,并且不是永久植根的。tcs.Task扎根了吗?更重要的是,假设request永远不会完成,因此不会设置结果。会tcs.Task永远闲逛吗?接续任务呢?或者,它们的生命周期是否依赖于 Foo 对象,并且当 Foo 实例被 GC-ed 时它们会消失?

0 投票
0 回答
40 浏览

c# - 等待依赖服务时出现 C# TaskCompletionSource 错误

我正在尝试实现 TaskCompletionSource 以停止代码执行,直到依赖服务方法完成,但是在尝试返回 TaskCompletionSource 结果时出现错误

调用依赖服务:

return tcs.SetResult(items) 行给出错误:

0 投票
1 回答
187 浏览

c# - 获取多线程应用程序产生的当前活动任务的计数

嗨,我是一名实习生,几乎没有 C# 经验,他陷入了接管使用TaskCompletionSourceBlockingCollection实现多线程的 Windows 服务的境地。我从来没有做过 C#。我正在尝试优化服务处理其任务的方式,即处理日志文件。

我的问题是,BlockingCollection用于创建执行的线程队列WorkiItem,如何获取队列中活动线程的计数?这意味着有多少项已被EnqueueTask()命令调用仍处于运行状态?我不想要_taskQ.Count返回的队列积压计数。我想要活动线程的计数。我想将线程数保持在四个,并且只有在前一个项目完成后才将一个项目入队。我不想要队列中的项目黑日志。

这个ProducerCOnsumer队列在服务启动时被调用,它的队列在每个服务轮询间隔被重新加载。我想通过将其设置为线程安全数据库表中文件的限制来限制这些线程中产生的数量。因此,如果线程数为 4,则 db 表中的文件数将为 4。在完成 1 个文件之前,队列不应产生额外的线程或将文件排入队列。为此,我想一个简单的解决方案是计算活动线程的数量(这意味着文件处理的活动数量并且在线程下降 1 之前不要添加任何新文件:

0 投票
1 回答
309 浏览

c# - 等待带有 ValueTask 的单个 .NET 事件

我有一个简单的ITimer界面,它只有一个经典的Elapsed.NET 事件,该事件在某个时间跨度后引发。

现在我想创建一个类似于Task.Delay(TimeSpan)但它应该使用该ITimer抽象而不是“实时”时间的功能。Task.Delay(TimeSpan)尽管返回 aValueTask而不是 a可能是一个好主意,但形式也不同,Task因为它可以实现无分配并且通常可能更高性能。无论如何,延迟的完成也只需要等待一次。

现在一个有点幼稚的实现可能看起来像这样。这里的问题是,使用 a 根本没有任何好处ValueTask。一个实现看起来如何能够充分利用ValueTask承诺(便宜且无需分配)。

0 投票
1 回答
43 浏览

websocket - 如何将此 WebSocket 模式转换为我可以等待/取消/继续/的任务

我有需要使用的第 3 方 WebSocket,请求以一种方法发送,响应以另一种方法给出。如何将这种类型的模式转换为更典型的异步/等待 TPL 任务,该任务将支持取消(通过令牌)、继续和所有其他好东西。

这是我到目前为止想出的,虽然我不确定它是否有效。我要到星期一才能测试它。

所以这是我的问题:

  1. 这行得通吗?

  2. 我一直在阅读关于TaskCompletionSource. 有没有更好的方法来做这一切TaskCompletionSource

  3. 我真的不喜欢锁,因为我知道它有可能会阻塞很长时间,但我不确定如何做得更好,因为如果我不锁定第二个调用,AsyncGetPositions可能已经清除任何位置回来。

  4. 即使lock我知道如果有超时或取消会产生问题,所以也许我只是删除取消令牌。我唯一能想到的另一件事是创建多个经过身份验证并准备好处理请求的客户端,然后像处理这些类型请求的线程池一样管理它们,但我不会很快这样做除此之外... idk。

0 投票
2 回答
216 浏览

c# - 如何最好地使用带有 SemaphoreSlim 的 TaskCompletionSource

这是我之前的问题的演变。回顾一下,我需要使用第 3 方 WebSocket,其中请求以一种方法发送,响应以另一种方法给出。我正在尝试将其转换为Task.

我阅读了这篇 MSDN 杂志文章,其中展示了一个使用 aSemaphoreSlim来控制条目的示例,但我的情况并不完全相同,我不确定最好的做法是什么。

我可以将它放在文章中所示SemaphoreSlim.Release()finally块中GetPositionsAsync(),但是如果出现错误,那么 finally 可能会在之前被调用,如果有另一个线程在等待信号量positionEnd(),则会导致错误。GetPositionsAsync()另一方面,如果我放入,SemaphoreSlim.Release()positionEnd()可以可靠地假设它GetPositionsAsync()会返回正确的结果吗?我担心如果释放发生,一个等待信号量的线程可能会Positions.Clear()在另一个线程保存 to 的值之前Positions调用result。所以无论哪种方式,实际上都是同样的担忧。哪个更好,或者有其他方法可以保护这个问题不一起发生?

这是我目前所拥有的......

0 投票
1 回答
62 浏览

c# - 如何在具有 TaskCompletionSource 的 IO-Bound 中使用异步操作?

我想在IO-Bound中实现异步机制,如何在不消耗新线程的情况下使用TaskCompletionSource实现它?

以下示例用于在线程池中创建新线程,但我正在寻找 TaskCompletionSource 的新方法,而无需在线程池中创建新线程?!

0 投票
0 回答
87 浏览

c# - 将 TaskCompletionSource.Task 状态设置为正在运行

我有一个外部长时间运行的进程(Web API 调用),我必须跟踪它才能知道它何时完成。我想把它封装在一个任务中。TaskCompletionSource 似乎是实现这一目标的正确工具。但是与 TaskCompletionSource 关联的任务从未处于运行状态。它以 WaitingForActivation 状态开始,并在设置结果后获得 RanToCompletion 状态。为了将其包含在更通用的框架中,我需要知道底层的长进程正在运行。在这种情况下,任务应该具有运行状态。我想知道如何获得/强制/模拟这种行为。

而在这个实际问题之上,我不明白用TaskCompletionSource绕过“正在运行”状态的设计选择。我们本来可以使用 Start 方法将状态设置为“正在运行”。它看起来简单而直接。但是调用“开始”会引发异常。我不明白这个选择。

希望很清楚。提前致谢。

0 投票
1 回答
75 浏览

c# - 涉及 TaskContinuationOptions.RunContinuationsAsynchronously 的奇怪案例

因此,如果没有System.Threading.Tasks.TaskContinuationOptions.RunContinuationsAsynchronously编写 this 来演示该async方法的其余部分在由new Thread(). 然而,System.Threading.Tasks.TaskContinuationOptions.RunContinuationsAsynchronously它仍然以某种方式找到[ThreadStatic]在新创建的线程中设置的特定值(因此不能是 TaskScheduler 线程)并在TrySetResult返回后立即清除。

什么嘿?这是怎么回事?

0 投票
1 回答
101 浏览

c# - TaskCompletionSource 而不是线程安全库

我有 C# avalonia应用程序通过开发人员提供的 SDK 使用了一些非线程安全的库。更具体地说是Windows Zoom SDK。一些 SDK 功能是基于事件驱动模式构建的。调用 SDK 方法后,应用程序必须等待执行结果回调到达。因此,使用 TaskCompletionSource 在应用程序中应用了基于任务的异步模式(请参见下面的代码)。

在应用程序中应用 async/await 模式后,SDK 无法正常工作(详情)。但是,这个问题没有讨论使用 Zoom SDK。问题是关于 async/await 模式的使用如何可能导致某些非线程安全库(或 SDK)的错误行为?

SDK包装方法:

SDK 回调处理程序:

高级代码: