2012-02-27 121 views
13

我有一个使用任务并行库实现的长时间运行的任务。当任务开始时,我抓取几个输入值和集合的快照,然后使用该信息执行各种操作。如果任何这些值或集合在任务运行时发生更改,我希望在完成后立即再次运行该任务。我应该创建一个新的任务还是有重用现有任务的方法?开始第二次迭代的最佳方式是什么?如何重新启动/重复使用重复性任务?

回答

11

创建一个新任务。

由于http://msdn.microsoft.com/en-us/library/dd270682.aspx指出,试图重新启动正在运行或已完成的任务不受支持。执行通常会引发异常的事情通常不是一个好主意,重新使用任务就是其中之一。

+0

你会如何表示需要完成第二项任务?在原始任务运行之前可能会发生更改,直到完成后的某个时间。 – SonOfPirate 2012-02-28 02:28:45

+0

基于这个标准,我认为你会做一个单一的,不终止任务轮询当前状态,如果状态改变,做你的事情。这里的基本要求是,这是异步发生的,以避免阻塞主线程。您需要放置某种标志来向Task表明应用程序正在关闭,并且应该终止。 – 2012-02-28 12:14:03

+0

一个单一的,不终止的任务是我在想什么。我可以使用CancellationToken来处理应用程序何时关闭,但我不确定我应该使用哪种机制来标记我需要任务来执行我的算法。如果我使用AutoResetEvent,那么我将无法取消该任务的线程将被暂停等待事件。另一方面,我读到使用SpinWait是非常密集的CPU。 – SonOfPirate 2012-02-28 12:54:54

1

您不能再次启动现有的Task。所以你有两种选择:

  1. 开始一个新的Task。这可能更干净。
  2. Task中运行循环,检查自上次以来是否发生了变化,如果有变化,则开始新的迭代。
+0

与上面相同的问题:您如何表示需要第二项任务? – SonOfPirate 2012-02-28 02:29:17

+0

很难说不知道你如何确定第二项任务是需要的。如果您想要在完成后重新启动,则可以使用事件。 – svick 2012-02-28 02:37:27

0

您还可以重构程序逻辑以使用函数指针(或VB.NET中的委托)。