完成.NET任务后的清理
我有以下处理INotification(自定义接口)的代码完成.NET任务后的清理,.net,asynchronous,task-parallel-library,.net,Asynchronous,Task Parallel Library,我有以下处理INotification(自定义接口)的代码 问题是一旦任务完成,我需要对通知执行一些清理。使用任务并行库执行此操作的方法是什么?您可以使用ContinueWith执行此操作。这是文档您可以使用ContinueWith执行此操作。以下是文档您可以提供多语句lambda: Task.Factory.StartNew(() => { mgr.Send(notification); Cleanup(); }; 您可以提供多语句lambda: Task.Factory.StartN
问题是一旦任务完成,我需要对通知执行一些清理。使用任务并行库执行此操作的方法是什么?您可以使用
ContinueWith
执行此操作。这是文档您可以使用ContinueWith
执行此操作。以下是文档您可以提供多语句lambda:
Task.Factory.StartNew(() => { mgr.Send(notification); Cleanup(); };
您可以提供多语句lambda:
Task.Factory.StartNew(() => { mgr.Send(notification); Cleanup(); };
这两个答案都是正确的,但我更喜欢ContinueWith选项。它们的区别在于是否在Send抛出时调用清理。既然你说这是清理,那么你的目标可能就是一直跑步,所以继续跑步更好。您可以继续进行筛选,只选择成功/失败/取消too@John:请注意,纯旧的
.ContinueWith()
将增加调度和执行单独任务的额外开销,并将异步运行,因此会有延迟。如果仍要使用ContinueWith
执行清理,可以使用TaskContinuationOptions.ExecuteSynchronously
作为第二个参数调用.ContinueWith()
。这将减少开销,并且几乎总是同步执行。不过这仍然会带来开销。@JamesManning:您也可以使用try-catch
过滤多行lambda中的成功/失败。在这种情况下,取消是不相关的,因为没有取消令牌,但即使有,它仍然只是一个try catch
。只有当我有一个外部提供的要附加延续的任务
对象时,我才使用.ContinueWith()
,而不是当我创建自己的任务时,我可以轻松地编写所需的控制流。这两个答案都是正确的,但我更喜欢ContinueWith选项。它们的不同之处在于是否在Send抛出时调用清理。既然你说这是清理,那么你的目标可能就是一直跑步,所以继续跑步更好。您可以继续进行筛选,只选择成功/失败/取消too@John:请注意,纯旧的.ContinueWith()
将增加调度和执行单独任务的额外开销,并将异步运行,因此会有延迟。如果仍要使用ContinueWith
执行清理,可以使用TaskContinuationOptions.ExecuteSynchronously
作为第二个参数调用.ContinueWith()
。这将减少开销,并且几乎总是同步执行。不过这仍然会带来开销。@JamesManning:您也可以使用try-catch
过滤多行lambda中的成功/失败。在这种情况下,取消是不相关的,因为没有取消令牌,但即使有,它仍然只是一个try catch
。只有当我有一个外部提供的任务
对象要附加一个延续时,我才使用.ContinueWith()
,而不是当我创建自己的任务时,我可以轻松地编写所需的控制流。