问题标签 [continuewith]
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# - 如何捕获已在任务的 ContinueWith 部分中引发的异常?
在一个button_click
事件中,我开始Task
异步进行一些耗时的计算。我使用Task.ContinueWith
TaskSheduler 并将其设置为延续到 UI 同步上下文,以在Textbox
.
现在让我们说最后一部分抛出一个异常,如下所示:
如果我启用调试选项“仅启用我的代码”,则程序会停止并收到警告:“用户代码未处理异常”
但是如果我不设置这个选项,异常就会消失在任何地方(没有程序崩溃,什么都没有)。
那么如何/在哪里可以处理这个异常?
编辑:请注意,正如标签所示,我使用的是 .NET-4.0
c# - C# Tasks.ContinueWith
我试图从异步方法执行两个不同的任务,但我的第二个任务只应该从第一个结束的地方开始。我尝试使用 ContinueWith 但没有成功。这是我的示例代码:
您可能会通过控制台输出注意到任务保持同时运行。是否有可能改变这种行为?
c# - 使用 TPL 以使用 continueWith 子句按顺序执行操作
首先,我将解释我要做什么。
我有一个组件 A正在使用组件 B。
为了在它们之间进行通信,我需要使用 event.
我的先决条件之一是让组件 B异步运行并按它们被调用的顺序运行事件处理程序。
此外,我想取消呼叫管道(当用户询问时)。因此,所有尚未执行的事件处理程序都将永远不会执行。
实现上的解决方案是TPL。我对我正在尝试做的事情做了一个 POC:
有这个片段的输出:
1
结束
2
如您所见,它在它真正完成之前完成。它在Finish之后显示2。
如果我通过这个修改以前的代码,它可以工作:
有这个片段的输出:
1
2
结束
如您所知,我不需要在任务声明中使用 continueWith 语句,而是在引发事件时使用。
为什么 Task.WaitAll(t); 第一个样品不起作用吗?
有人可以帮助我吗?
c# - 如何在此示例中使用 ContinueWith
我有以下异步方法,它应该根据传递给方法的列表获取我需要的所有字符串:
任务完成后,此方法的调用者将如何使用 Task.ContinueWith() 处理返回的 List?我想做这样的事情:
c# - C#:如何在 task.continuewith 中捕获取消异常
我尝试了很多方法,但未能在 task.ContinueWith 中捕获取消异常。这里有什么问题吗:
输出是:
取消:
这意味着捕获了取消异常,但异常本身为空。我的问题是如何在这里获得取消例外?
谢谢
德里克
c# - C# 中实体框架数据库处理方法的异步等待和继续
我有一种Save
添加/更新联系人的方法。我设计了一个异步方法。但我无法从数据库中获取记录。
请看一下代码:
在上面的代码中,它总是返回 NULL
请帮助我任何人满足要求。
注意:上述方法在库中。请帮助我如何使用异步使用此方法。
c# - 等待由 ContinueWith 链接产生的任务
我正在使用 ContinueWith 链接任务并等待它们。当我在循环中引入延迟时(评论 - 这意味着有足够的时间完成任务),我可以看到所有任务都已完成。当我消除延迟时,我可以看到只处理了第一条消息。不处理剩余的消息。我假设代码在完成所有任务之前退出方法。不确定我是否在等待错误。
如何确保完成所有任务而不会在循环中引入延迟?
c# - 在没有任务对象的情况下等待所有任务线程
我有一个应用程序使用.NET 4.0
(所以没有async
/await
可用)。我正在为使用服务调用的方法编写测试。
例如,我的测试调用method A
. 有一个返回 aMethod A
的异步服务调用,我们在. 什么都不返回。method B
Task
ContinueWith
Method A
问题是主线程在有机会完成Assert
之前到达调用,因此测试失败。ContinueWith
目前解决这个问题的方法是这样做Thread.Sleep(10)
,以便ContinueWith
有时间执行。然而,这带来了很多问题,例如浪费时间(当有数百次 - 数千次测试时会加起来)在较慢的机器上测试失败。
我想知道是否有任何方法可以在Thread.WaitAll()
没有实际拥有Task
对象的情况下进行某种操作,因为无法获得它们。更改代码不是一种选择,因此必须从测试中完成。
注意:如果我们有Task
/Thread
对象,我知道执行此操作的方法,但我无权访问它们,因此请不要将其标记为与那些重复的对象,因为它不是。
c# - 使用 ContinueWiths 链更新 UI
我尝试使用多个 ContinueWiths 来更新 UI。所以我希望每个 ContinueWith Task 都会单独更新 UI,但真正发生的情况是,它们会互相等待并立即更新 UI。因此,即使您每个 ContinueWith 都按时运行,但 UI 仅在最后一个完成时更新。
Thread.Sleep 表示此上下文中的工作。
答案:StartNew is Dangerous by Stephen Cleary。博客文章的最后一部分几乎使用了与我相同的示例。
我编辑了帖子,回答了我自己的问题,〜并排。
编辑:在 Test1() StartNew 将在线程池上运行,因为没有任何特定的 TaskScheduler 集。所以“工作”将在线程池上运行,但“更多工作”和“停止”将在 GUI 线程上运行,因为有一个设置的上下文。
经验:
编辑:但是,如果“工作”在线程池上运行,为什么结果会有延迟?因为我错了。当我第二次或第 n 次运行测试应用程序时,您在下面看到的只是真实的。
如果你运行它,会发生以下情况:
如果我第一次运行调试,它看起来像这样:
编辑:我想,如果我第一次运行 Test1(),'Work' 真的在线程池上运行。但是第二次 TaskScheduler.FromCurrentSynchronizationContext() 也将适用于“工作”,因此它将在 GUI 线程上运行。那些 Thread.Sleeps 真正在 GUI 线程上运行,我无法移动表单。
所以我的第一个问题是,为什么 UI 没有单独更新?因为这是我所期望的。
如果我从每个 ContinueWith 开始一个单独的任务,我会得到所需的结果(单独的 UI 更新),但这看起来是错误的/丑陋的/复杂的,我感觉我没有正确使用 ContinueWith(用于 UI 更新)。
编辑:这个工作的原因是,因为我没有使用 ContinueWiths 的“上下文”,所以它们将在线程池上运行,而不是锁定 UI。新创建的任务将在 UI 上运行,因为这是它们设置的上下文。
结果:
编辑:tl;博士:小心 StartNew 和 TaskScheduler.FromCurrentSynchronizationContext();