问题标签 [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 回答
3568 浏览

angular - SignalR 解决方法从服务器获取客户端数据

我知道当调用来自服务器时,SignalR 不能从客户端返回。在 SignalR 的 github 存储库中,我要求提供一种解决方法(https://github.com/aspnet/SignalR/issues/1329),他们建议我通过将结果从客户端发送到服务器到集线器中的另一个方法来获得结果所以使用 TaskCompletionSource 和一些连接元数据来捕捉结果,但我坚持如何做到这一点

控制器服务器:

集线器服务器

Angular 4 客户端

正如您在这段代码中看到的那样,我不知道在控制器方法和 Hub 方法中要做什么才能知道方法 MessageReceive 被调用并获取他的返回以将其发送回控制器请求。

0 投票
2 回答
475 浏览

c# - 在 C# 中异步等待事件

我正在研究 WCF 服务/客户端,试图弄清楚如何用不会阻塞调用者线程的东西替换 ManualResetEvent。
最重要的是在事件被触发await client.CloseAsync()之前不会被调用。FinishedEventReceived

我看过使用TaskCompletionSource但我有点不确定在这种情况下它会如何工作。

我知道代码有点难看,完全违背了使用异步编程的目的,我的道歉。
有任何想法吗?

0 投票
2 回答
693 浏览

c# - 无法获取 TaskCompletionSource 的结果

你好我有以下问题:

我想执行类似于事务的操作。我想async在收到外部触发器后执行一些操作。因此,我使用的TaskCompletionSource是在表示触发器的方法中设置的 : TriggerTransaction。 当我按下特定的控制台键时,

会在线程池中调用此触发方法。Main

在我按下A关键字后,TriggerTransaction执行并设置TaskCompletionSource-s。仍然主线程不计算两个等待任务的总和。

PS如果你想知道为什么我确实使用 aList<dynamic>来存储TaskCompletionSource-s ,那是因为 TransactionOperations 的返回类型会有所不同。其中一些会返回int,其他String.. ..etc Bool

为了更好地理解,我制作了一个架构-正如您将看到的那样:
-我要存储 TCS-es 的列表-
仅在设置外部触发器后才完成的某些调用(事务已执行)
您可以在 中看到Calls,都有不同的返回类型。
在此处输入图像描述

0 投票
1 回答
309 浏览

c# - 使用 TaskCompletionSource 的异步方法中的死锁

我正在尝试公开一个 ASP.NET Web API,它必须捕获并返回照片作为附件。我正在使用CameraControl.Devices 2.1.0-beta来控制我的 Nikon DSLR 和 .NET 4.6。

但是我的行为非常不一致。有时第一个 HTTP 请求会设法返回一张照片,但从那里开始它会在组成最终的 HttpResponseMessage 之前停止,然后 HTTP 请求就会挂起并超时。我相信这是由异步操作引起的死锁。它始终执行 DeviceManager_PhotoCaptured 中的逻辑,将照片从 DSLR 传输到文件夹。有时它甚至会从一个请求中获取两张照片。

我究竟做错了什么?你知道更好的方法吗?

0 投票
2 回答
43 浏览

c# - 我可以保证已经运行了可运行的任务延续吗?

这是我正在处理的一段代码中显着减少的测试用例:

假设这段代码在async方法的上下文中运行,应该替换什么// ???来确保这段代码打印1而不是0

我相信我理解为什么编写的程序总是会打印0——代码是同步执行的,调度程序没有任何结果。但我很惊讶地得知

还不够。有点讽刺的是(但完全可以理解,因为它不涉及异步执行)

另一方面,

似乎确实足够了,但我不清楚这是保证还是时间上的意外。

以另一种方式问这个问题:我可以编写任何(合理的)代码来保证在继续task之前运行所有的延续吗?

0 投票
1 回答
242 浏览

asynchronous - 如何使用任务完成源

我遇到了多生产者和单一消费者的情况。我选择了一个公共thread-safe资源,其中所有生产者Enqueue项目。但是,当使用该资源时,我不知道如何有效地制作await新项目的生产者。Dequeue

POCO

生产者

贮存

消费者

正如您在Consumer课堂上看到的那样,我想包装我的Storage's methodDequeue in aTask so that i canawait it in myConsumer . The only reason i usedTaskCompletionSource is to be able to communicate between theDequeue andEnqueue methods in theStorage`。

我不知道我是否需要重新初始化,tcs但我想我这样做是因为我Task在每次Enqueue操作后都想要一个新的。

我还重新初始化了tcs内部,lock因为我希望该特定实例设置结果。

我应该如何处理这个?实施好吗?会System.Reactive提供更好的选择吗?

0 投票
1 回答
322 浏览

c# - TaskCompletionSource 执行缓慢

通过在同步方法中循环多个TaskCompletionSource实例,超过5个程序执行起来会变慢,但是在异步方法中就没有这个问题了。

这是有问题的代码 使用同步方式,执行变慢,1秒左右创建一个

这是没有问题的代码,执行非常快

0 投票
5 回答
343 浏览

c# - 将旧的异步模式包装到 TaskCompletionSource 时返回等待?

我正在研究 C# Asnc-await 模式,目前正在阅读 S. Cleary 的 C# Cookbook 中的并发

他讨论了使用 TaskCompletionSource (TCS) 将旧的非 TAP 异步模式包装到 TAP 结构中。我不明白的是,为什么他只返回 TCS 对象的 Task 属性而不是等待它 TCS.Task ?

这是示例代码:

旧的包装方法是 DownloadString(...):

将其包装到 TAP 构造中:

现在为什么不这样做:

两者在功能上有区别吗?第二个不是更自然吗?

0 投票
1 回答
1205 浏览

.net - TaskCompletionSource 生成的任务是否需要 Dispose()d?

TaskCompletionSource在我的软件中使用将网络数据包分发到async/await方法。所以在我的代码中,软件需要等待网络数据包从接收处理程序中解复用并移交给方法的各个点async Wait()。每秒可能有很多很多数据包,我正在决定是否要将数据包推TaskCompletionSource送到Queue. 所以,只要没有,TaskCompletionSource我就会创建一个新的,这会导致一个新的Task对象。

根据这个问题Do I need to dispose of a Task? 并且根据此博客.NET Task的并行编程不需要Disposed。但是,我有时TaskCompletionSource每秒实例化数千个。链接博客中的详细答案还说,Task可能在内部使用WaitHandle. 现在我有一种强烈的感觉,即我的情况正是如此,我应该DisposeTaskCompletionSource.

这就是我等待新数据包的方式。此方法将被调用,await也可以大量并行调用:

我从网络处理程序推送数据包的方法如下所示:

我在 .NET Core >= 2.2 上。博客条目指出WaitHandle.NET 4.5 中的行为也发生了变化。

Task问题:在这种特定情况下我需要 Dispose吗?我会创建很多Handles吗,如果我没有在接收到沿此代码路径的许多数据包时Dispose创建的任务?TaskCompletionSource这是博客条目警告我的场景吗?

请不要告诉我,只要您不能告诉我更好的方法与async/await模式非常兼容并且能够将这些数据包分发给各种选定的侦听器,请不要告诉我这种方法是一个糟糕的选择。也请不要告诉我,由于许多网络数据包而创建许多对象通常是一个坏主意。

0 投票
2 回答
441 浏览

c# - 如何形成TaskCompletionSource的集合并保持类型安全

我有一些异步方法:

为简单起见,以上是半伪代码。我这样称呼其中一种方法:

A a = await service.GetAAsync();

现在的问题是TaskCompletionSource<T>通用的,如果我有 100 种方法,我将不得不为每个返回类型创建一个变量。但是由于一次只能调用一个方法,因此最好使用单个方法TaskCompletionSource,但不要将其键入到object (TaskCompletionSource<object>).

我不想这样做:

object a = await service.GetAAsync();

因为这需要客户进行铸造。所以最好的解决方案是有一个单一的TaskCompletionSource,但以某种方式输入。或者可以有一个字典TaskCompletionSource。这两者在我看来都是不可能的。

我应该如何解决这个问题?

更新:

有关我的情况的背景,请查看:Wrap synchronous code into async await in disconnected scenario