问题标签 [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# - 如何取消在 C# 中启动进程的异步任务?
目前,我的代码从 svn 运行结帐,并使用如下所示的两个任务将 stdout 和 stderr 重定向到文本框。当用户单击 StopButton 并能够取消下载时,我希望能够立即取消任务。我了解,如果我将 cmd.exe 命令更改为说出诸如“暂停”之类的内容,它会继续运行直到用户单击某些内容,我可以使用 StopButton 取消此命令。我对 C# 非常陌生,并试图理解为什么我可以取消该命令而不是 svn 下载。
这是我应该实现代码的方式还是应该尝试不同的方法?
非常感谢你的帮忙!我真的很感激!
c# - 如何结合 TaskCompletionSource 和 CancellationTokenSource?
我有这样的代码(在这里简化)等待完成任务:
这个想法是订阅并等待true
布尔值流中的。这完成了“任务”,我可以继续超越await
.
但是我想取消——但不是订阅,而是等待。我想将取消令牌(以某种方式)传递给,task_completion_source
所以当我取消令牌源时,await
将继续前进。
怎么做?
更新:CancellationTokenSource
在此代码之外,我这里只有它的令牌。
wpf - WPF,如何知道任务已完成
我正在开发一个 MVVM WPF 应用程序,我有一些任务要做。
- 首先加载文件 csv 并解析它
- 在后台不要阻塞 ui 线程并将值保存在数据库中。要将行保存到数据库中,我需要使用异步等待任务。
我的问题是我不知道如何通过弹出通知或其他已经保存在数据库中的值来通知用户。
在我的视图模型中
在我的 Service.cs
提前致谢。
乔林斯
c# - 异步任务、取消和异常
我目前正在学习如何使用Task
s 正确地公开我们的库 API 的异步部分,以便它们可以更轻松、更好地为客户使用。我决定采用将 a 包裹起来的TaskCompletionSource
方法Task
,它没有在线程池上安排(在此实例中无论如何都不需要,因为它基本上只是一个计时器)。这很好用,但现在取消有点让人头疼。
该示例显示了基本用法,在令牌上注册委托,但比我的情况稍微复杂一点,更重要的是,我不确定如何处理TaskCanceledException
. 文档说要么只是返回并将任务状态切换到RanToCompletion
,要么抛出一个OperationCanceledException
(导致任务的结果是Canceled
)都可以。但是,这些示例似乎仅与或至少提及通过传递给的委托启动的任务TaskFactory.StartNew
。
我的代码目前(大致)如下:
(执行过程中没有结果,也没有可能的异常;我选择从这里开始,而不是从库中更复杂的地方开始的原因之一。)
在当前表单中,当我调用TrySetCanceled
时,如果我等待返回的任务TaskCompletionSource
,我总是会得到一个。我的猜测是这是正常行为(我希望是这样),并且当我想使用取消时,我应该在呼叫周围加上/ 。TaskCanceledException
try
catch
如果我不使用TrySetCanceled
,那么我最终会在完成回调中运行,并且任务看起来正常完成。但我想如果用户想要区分正常完成的任务和取消的任务,这TaskCanceledException
几乎是确保这一点的副作用,对吧?
我不太明白的另一点:文档表明任何异常,即使是与取消有关的异常,AggregateException
都由 TPL 包装在 an 中。但是,在我的测试中,我总是TaskCanceledException
直接得到,没有任何包装。我在这里遗漏了什么,或者只是记录不佳?
TL;博士:
- 对于要转换到
Canceled
状态的任务,总是需要相应的异常,并且用户必须在异步调用周围包裹try
/catch
才能检测到它,对吗? - 被
TaskCanceledException
打开包装也是预期的和正常的,我在这里没有做错什么吗?
c# - 带有 TaskCompletionSource 和 async/await 的 UDP 协议
我有一个使用 UDP 与硬件设备通信的库。对话是这样的:
首先,我发送操作码 000E 并期望得到 000F 作为响应。一旦我得到 000F,我会发送一个 DC23 并期待一个 DC24 作为响应。(响应中包含附加信息以及操作码。)将来,可能需要在此对话中添加更多步骤。
负责与设备通信的对象有如下接口:
当我尝试天真地编写此代码时,我最终switch
会在事件处理程序中得到一条语句,该语句DataArrival
根据响应代码执行不同的操作,如下所示:
它开始看起来像是要变成状态机了。我认为必须有更好的方法来使用TaskCompletionSource
and async/await
。
我该怎么做呢?
c# - ASP.NET MVC POST 在第一次尝试时无限期等待
我有一个用 Html.BeginForm 制作的标准表单,它发布到控制器中的异步操作。它看起来像这样(这是一个大纲,而不是实际代码):
第一次提交表单时,浏览器将无限期地等待响应,即使可以看到调试器单步执行已到达 RedirectToAction。如果然后停止浏览器中的请求,并再次提交,重定向就会发生。所有后续登录尝试也成功重定向。在第一次尝试期间,身份验证令牌也以某种方式未设置。
这可能与内部的委托使用有关loginRep.Login
。在它里面最终会做这样的事情:
有谁明白发生了什么?如果这是一个死锁,我不会期望看到调试器到达重定向,我也不会期望登录对除第一次以外的所有尝试都有效。
请注意,如果一个人只是跳过发送登录请求而只是硬编码成功响应的样子,则该表单第一次工作。
c# - 取消调用事件的异步方法
我有一个无头 UWP 应用程序,它使用外部库连接到串行设备并发送一些命令。它运行一个无限循环(如果为真),循环之间有 10 分钟的暂停。测量过程大约需要 4 分钟。外部库需要运行 3 次测量,并在每次测量后通过引发事件发出信号。当第四次引发事件时,我知道我可以返回结果。
4 小时(+/- 几秒)后,库停止引发事件(通常它引发事件一到两次,然后停止,没有错误,什么都没有)。
我在 DoMeasureAsync() 下面实现了一个 CancellationTokenSource,它应该在 8 分钟后在 TaskCompletionSource 上设置 IsCancelled 属性,以便任务返回并继续循环。
问题:当测量未完成时(NMeasureCompletionSource 永远不会在类 CMeasure 中获得其结果集),来自 nMeasureCompletionSource 的任务永远不会取消。RespondToCancellationAsync() 中定义的委托应在 8 分钟后运行。
如果测量运行正常,我可以在日志中看到
被调用。
编辑:
GC 是否有可能在 4 小时后进入,并且可能会释放一些变量,这样做会使应用程序无法将命令发送到传感器?- 事实并非如此
我在这里想念什么?
xamarin - 适用于 Xamarin 的 Amazon IAP 插件 - 使用 TaskCompletionSource 时崩溃
我正在尝试为 Xamarin 的 Amazon IAP 插件实现包装器。它以下列方式使用基于事件的系统:
您可以发起方法调用并监听事件。方法调用发起请求,其中一些返回响应。事件是系统生成的异步消息,它们响应方法调用而发送,以将请求的数据返回给您。 在这里查看更多
我的目标是将这个基于事件的系统包装到一些 API 中,这样我就可以将插件与任务一起使用,这样我就可以使用async-await
语法。为了实现这一点,我TaskCompletionSource
在下面的例子中使用了类似的东西:
如果该方法被调用一次,此代码似乎可以正常工作,但如果它被连续调用两次,则应用程序立即崩溃,并且打印到控制台的唯一内容是以下消息..
..这根本没有意义。
那么我在这里有什么明显的遗漏吗?或者它可能是插件的错误?
我已经使用上面的代码创建了一个存储库,因此您可以重现该问题。这是我的游乐场,所以请忽略项目的整个结构,只关注AmazonIAPService和MainActivity类。
提示 1:
注释行//iapService.RemoveGetProductDataResponseListener(delegator.responseDelegate);
也会导致崩溃,消息相同,但在第一次调用该方法时已经发生。
提示 2:
包含AmazonIAPService
一个注释方法,它await Task.Delay(TimeSpan.FromMilliseconds(1))
以一种我真的不喜欢的非常 hacky 的方式使用和解决上面的问题。
c# - 实现一个有上限和缓冲的作业执行器
我想实现一个有上限和缓冲的作业执行器。
它将有一个方法:
这个想法是值是异步排队的,一旦fillTimeInMillisec
经过毫秒,或者缓冲区被填充到其唯一值的上限,就会在实践中执行并且异步任务全部完成。执行完成后(可能需要很长时间),可以重新填充缓冲区并进行新的异步执行。
我想到了以下伪代码行中的一些内容
- 使用 a
Timer
,等待fillTime
通过,一旦过去,创建一个新任务,它将完成工作(见下文)。 - 在新值上,锁定 a
rwlock
以供读取。检查缓冲区是否已满,如果是,请等待 aManualResetEvent
或 aTaskCompletionSource
。 - 将新值添加到缓冲区 (
HashSet<string>
)。 - 如果缓冲区已满,则创建一个新的执行任务,该任务将锁定
rwlock
for write,对所有收集的值执行工作,并使用TaskCompletionSource
. - 等待
TaskCompletionSource
执行缓冲任务(在上一步中提到)。
我的问题:如何同步Timer
和填充缓冲区检查,缓冲区满时如何等待,TaskCompletionSource
开始执行时如何在实例之间切换并允许新值到达。
c# - 是什么导致了死锁?
我的一段代码面临死锁问题。值得庆幸的是,我已经能够在下面的示例中重现该问题。作为普通的 .Net Core 2.0 控制台应用程序运行。
我期望的是完整的序列如下:
Thread.Join
但是,实际序列在调用中停止:
最后,如果我在正文中插入一个小延迟MainAsync
,一切都会好起来的。为什么(在哪里)会发生死锁?
SemaphoreSlim
注意:在我使用 a而不是 a解决的原始代码中TaskCompletionSource
,根本没有问题。我只想了解问题出在哪里。