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

c# - 如何使用超时取消 TaskCompletionSource

我有使用 await 关键字异步调用的函数:

该函数查看它是否具有所需的信息,如果有,则返回它。如果它没有详细信息,它会发送一个请求,该请求最终应该作为一个事件出现。此时我的代码(未显示)找到存储的 TaskCompletionSource 项,设置结果并返回它。这一切都很好,但我现在被要求考虑当我通过“_evtClient.SubmitStateRequest(entity, propName);”请求状态时可能永远不会返回回复的情况。线。我需要实现某种超时机制,以便我可以取消 TCS 任务,以便函数调用者可以正常失败。我一直在寻找 SO 和互联网,找不到任何看起来正确的东西。我现在不确定是否需要以不同的方式重组上述代码。任何人都可以建议或指出类似的情况吗?

调用上述函数的代码可以像这样一次性调用它:

或分批,像这样:

0 投票
1 回答
882 浏览

c# - 我是否应该始终完成 TaskCompletionSource?

如果a从未完成(即,或从未被调用), aTaskCompletionSource和它会发生什么?因为它永远不会完成,它会永远存在吗?TaskTaskCompletionSourceSetCancelledSetExceptionSetResultTask

在下面的示例中,我有一个参数化测试的简化版本。如果超时(MyEevent未在 1000 毫秒内调用),则TaskCompletionSource( tcs) 永远不会完成。我有很多这样的测试。我是否需要进行任何类型的清理(例如确保调用 tcs.SetCancelled())。?

当我们这样做时,有什么办法可以改进上述测试(例如,使它更简洁/简单/可读)?

0 投票
0 回答
100 浏览

c# - 在基于 GUI 事件的应用程序中处理客户端-服务器通信

和我的朋友一起,我们正在制作简单的聊天应用程序。客户端使用 C#,服务器使用 Java。整个通信基于 WebSockets。

我在设计最佳应用程序流程时遇到问题。目前它的工作方式如下:

登录步骤:

  1. 按下登录按钮,该按钮以数据为参数调用发送方法
  2. 控制器已订阅事件回调
  3. 收到响应后,将触发 OnLogin 事件

示例代码:

在视图的某个地方:

一切正常,但...

我想知道在 Login 方法中操作是否成功。我不能这样做,因为我的网络库使用事件接收数据,还因为它会阻塞主线程,然后 UI 会被冻结。问题是它应该如何正确完成?我读了一些关于 async/await 和 TaskCompletionSource 但我不确定如何在我的情况下使用它。

0 投票
1 回答
2359 浏览

c# - TaskCompletionSource 用法

如果完成源被取消,我会在结果变量中收到什么?

我不太确定这种方法是否正确。

  1. 换句话说,依赖任务状态而不是为带有状态变量的“someresult”创建包装器是一种好习惯吗?
  2. 如何处理取消的任务?我不喜欢回调,也不喜欢使用 ContinueWith 的解决方案,我可以在其中分析任务状态。
0 投票
1 回答
1218 浏览

c# - 使用 TaskCompletionSource 与 BufferBlock 包装事件

Lucian 在这里讨论了一种模式(提示 3:在返回任务的 API 中包装事件并等待它们)。

我正在尝试在一个经常调用的方法上实现它,该方法看起来像下面的人为代码:

我担心性能,TaskCompletionSource每次调用都会更新(假设我每 100 毫秒调用一次此方法)。

然后我正在考虑BufferBlock<T>改用,认为它不会在每次通话时都被更新。所以它看起来像:

调用对象会这样称呼它:

有没有人有任何关于使用的想法BufferBlock<T>

0 投票
3 回答
15257 浏览

c# - TaskCompletionSource 抛出“尝试将已完成的任务转换为最终状态”

我想用来TaskCompletionSource包装MyService这是一个简单的服务:

这段代码第一次运行良好。但是第二次我ProcessAsync只调用 is 的事件处理程序(每次都使用Completed相同的变量),因此它将执行两次!service第二次抛出此异常:

已完成时尝试转换任务最终状态

我不确定,是否应该tcs像这样声明为类级别变量:

我必须用不同的返回类型包装许多方法,这样我必须编写丢失的代码、变量、事件处理程序,所以我不确定这是否是这种情况下的最佳实践。那么有没有更好的方法来完成这项工作?

0 投票
1 回答
254 浏览

c# - MYOB oauthService.GetTokensAsync 未显示对话框

由于我对 TaskCompletionSource的问题

我尝试了一种类似的技术来获取令牌

使用

但是,当我运行它时程序会锁定。

以下工作正常

并弹出授权对话框。

0 投票
3 回答
967 浏览

c# - 为什么我的 TCS 不等待?

async关键字确实会导致CI​​L发生变化(即使方法内没有 await),但它主要是为了允许await存在。

但我没想到会发生以下情况:

这个打印:

但如果我改变

它打印:

问题

为什么我看不到延迟?TCS 仅在三秒后解决。同时,任务还没有解决,应该等待。

0 投票
1 回答
698 浏览

c# - 解包异步操作,它是 TaskCompletionSource 中的异步回调

我的服务中有一个方法被我的视图模型调用以获取图像。该图像是从使用回调机制而不是等待的外部库(Xamarin 中的 iOS API)中获取的。

为了使我的方法可以等待,我将方法包装在 TaskCompletionSource 中。虽然问题出在 API 回调中,但我需要调用另一个必须返回任务的方法。完成源将它的结果设置为Task<IBitmap>,然后我返回 CompletionSource 任务,它现在变成Task<Task<IBitmap>>了 所以我最终得到的结果是我的最终返回值Task<Task<IBitmap>>而不是Task<Bitmap>.

我应该如何解开嵌套的任务,以便我只返回一个Task<IBitmap>

0 投票
1 回答
3186 浏览

c# - 即使任务状态转换为“RanToCompletion”,等待任务也永远不会完成

首先,道歉——我无法在一个适当简单的示例应用程序中重现这种行为。此功能在对调用代码进行一些重构之前有效。

我正在尝试使用 TaskCompletionSource 来发出异步操作结束的信号(长时间运行的进程完成或超时可能会使用 TrySetResult() 发出完成信号)。

我的问题是,即使我可以看到 Task 正在从“WaitingForActivation”转换为“RanToCompletion”,但对 await 的调用永远不会完成。

作为测试,我创建了一个 Task Continuation,它被调用,我添加了一个 Timer 来显示 Task 状态:

这将产生以下输出:

当然随着继续被击中,直接等待任务也应该完成,不是吗?这种行为可能有哪些外部(调用)因素?