问题标签 [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.
c# - 如何使用超时取消 TaskCompletionSource
我有使用 await 关键字异步调用的函数:
该函数查看它是否具有所需的信息,如果有,则返回它。如果它没有详细信息,它会发送一个请求,该请求最终应该作为一个事件出现。此时我的代码(未显示)找到存储的 TaskCompletionSource 项,设置结果并返回它。这一切都很好,但我现在被要求考虑当我通过“_evtClient.SubmitStateRequest(entity, propName);”请求状态时可能永远不会返回回复的情况。线。我需要实现某种超时机制,以便我可以取消 TCS 任务,以便函数调用者可以正常失败。我一直在寻找 SO 和互联网,找不到任何看起来正确的东西。我现在不确定是否需要以不同的方式重组上述代码。任何人都可以建议或指出类似的情况吗?
调用上述函数的代码可以像这样一次性调用它:
或分批,像这样:
c# - 我是否应该始终完成 TaskCompletionSource?
如果a从未完成(即,或从未被调用), aTaskCompletionSource
和它会发生什么?因为它永远不会完成,它会永远存在吗?Task
TaskCompletionSource
SetCancelled
SetException
SetResult
Task
在下面的示例中,我有一个参数化测试的简化版本。如果超时(MyEevent
未在 1000 毫秒内调用),则TaskCompletionSource
( tcs
) 永远不会完成。我有很多这样的测试。我是否需要进行任何类型的清理(例如确保调用 tcs.SetCancelled())。?
当我们这样做时,有什么办法可以改进上述测试(例如,使它更简洁/简单/可读)?
c# - 在基于 GUI 事件的应用程序中处理客户端-服务器通信
和我的朋友一起,我们正在制作简单的聊天应用程序。客户端使用 C#,服务器使用 Java。整个通信基于 WebSockets。
我在设计最佳应用程序流程时遇到问题。目前它的工作方式如下:
登录步骤:
- 按下登录按钮,该按钮以数据为参数调用发送方法
- 控制器已订阅事件回调
- 收到响应后,将触发 OnLogin 事件
示例代码:
在视图的某个地方:
一切正常,但...
我想知道在 Login 方法中操作是否成功。我不能这样做,因为我的网络库使用事件接收数据,还因为它会阻塞主线程,然后 UI 会被冻结。问题是它应该如何正确完成?我读了一些关于 async/await 和 TaskCompletionSource 但我不确定如何在我的情况下使用它。
c# - TaskCompletionSource 用法
如果完成源被取消,我会在结果变量中收到什么?
我不太确定这种方法是否正确。
- 换句话说,依赖任务状态而不是为带有状态变量的“someresult”创建包装器是一种好习惯吗?
- 如何处理取消的任务?我不喜欢回调,也不喜欢使用 ContinueWith 的解决方案,我可以在其中分析任务状态。
c# - 使用 TaskCompletionSource 与 BufferBlock 包装事件
Lucian 在这里讨论了一种模式(提示 3:在返回任务的 API 中包装事件并等待它们)。
我正在尝试在一个经常调用的方法上实现它,该方法看起来像下面的人为代码:
我担心性能,TaskCompletionSource
每次调用都会更新(假设我每 100 毫秒调用一次此方法)。
然后我正在考虑BufferBlock<T>
改用,认为它不会在每次通话时都被更新。所以它看起来像:
调用对象会这样称呼它:
有没有人有任何关于使用的想法BufferBlock<T>
?
c# - TaskCompletionSource 抛出“尝试将已完成的任务转换为最终状态”
我想用来TaskCompletionSource
包装MyService
这是一个简单的服务:
这段代码第一次运行良好。但是第二次我ProcessAsync
只调用 is 的事件处理程序(每次都使用Completed
相同的变量),因此它将执行两次!service
第二次抛出此异常:
已完成时尝试转换任务最终状态
我不确定,是否应该tcs
像这样声明为类级别变量:
我必须用不同的返回类型包装许多方法,这样我必须编写丢失的代码、变量、事件处理程序,所以我不确定这是否是这种情况下的最佳实践。那么有没有更好的方法来完成这项工作?
c# - 为什么我的 TCS 不等待?
async
关键字确实会导致CIL发生变化(即使方法内没有 await),但它主要是为了允许await
存在。
但我没想到会发生以下情况:
这个打印:
但如果我改变
至
它打印:
问题
为什么我看不到延迟?TCS 仅在三秒后解决。同时,任务还没有解决,应该等待。
c# - 解包异步操作,它是 TaskCompletionSource 中的异步回调
我的服务中有一个方法被我的视图模型调用以获取图像。该图像是从使用回调机制而不是等待的外部库(Xamarin 中的 iOS API)中获取的。
为了使我的方法可以等待,我将方法包装在 TaskCompletionSource 中。虽然问题出在 API 回调中,但我需要调用另一个必须返回任务的方法。完成源将它的结果设置为Task<IBitmap>
,然后我返回 CompletionSource 任务,它现在变成Task<Task<IBitmap>>
了 所以我最终得到的结果是我的最终返回值Task<Task<IBitmap>>
而不是Task<Bitmap>
.
我应该如何解开嵌套的任务,以便我只返回一个Task<IBitmap>
?
c# - 即使任务状态转换为“RanToCompletion”,等待任务也永远不会完成
首先,道歉——我无法在一个适当简单的示例应用程序中重现这种行为。此功能在对调用代码进行一些重构之前有效。
我正在尝试使用 TaskCompletionSource 来发出异步操作结束的信号(长时间运行的进程完成或超时可能会使用 TrySetResult() 发出完成信号)。
我的问题是,即使我可以看到 Task 正在从“WaitingForActivation”转换为“RanToCompletion”,但对 await 的调用永远不会完成。
作为测试,我创建了一个 Task Continuation,它被调用,我添加了一个 Timer 来显示 Task 状态:
这将产生以下输出:
当然随着继续被击中,直接等待任务也应该完成,不是吗?这种行为可能有哪些外部(调用)因素?