Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
完成.NET任务后的清理_.net_Asynchronous_Task Parallel Library - Fatal编程技术网

完成.NET任务后的清理

完成.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

我有以下处理INotification(自定义接口)的代码


问题是一旦任务完成,我需要对通知执行一些清理。使用任务并行库执行此操作的方法是什么?

您可以使用
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()
,而不是当我创建自己的任务时,我可以轻松地编写所需的控制流。