Task.Factory.StartNew - 使用.Wait()继续

时间:2013-05-31 07:39:42

标签: .net vb.net asynchronous taskfactory

我正在使用TaskFactory宣布任务,我有一个严重的疑问。

我正在创建声明继续创建的任务,我没有分配 这也是第二项任务,将在稍后开始。

声明是这样的:

Dim taskConta = Tasks.Task(Of DataSet).Factory.StartNew(
                Function() FunctionToLaunch(parameter), TokenCancel.Token,  Tasks.TaskCreationOptions.LongRunning)

taskConta.ContinueWith(New Action(Sub() Throw New TimeoutException("Exception Error"), System.Threading.Tasks.TaskContinuationOptions.OnlyOnFaulted)

如你所见。此任务声明为:

  

TaskContinuationOptions.OnlyOnFaulted

执行任务然后我的下一行代码是:

 taskConta.Wait()

问题是:

如果我的任务退出故障并且我使用了.Wait()。  在代码继续执行之前是否会启动ContinueWith Action?  或者它会排队并在以后开始?

如果以后启动,需要多长时间?  这可以做到我的Throw Exception可能会超出范围。

我知道我可以这样做:

  taskConta.Wait()

  If taskConta.Status <> Tasks.TaskStatus.RanToCompletion Then
         Throw New TimeoutException("Message")
  End If

我是否想知道TaskFactory如何继续使用队列。

1 个答案:

答案 0 :(得分:0)

  

如果我的任务退出故障并且我使用了.Wait()。在代码继续执行之前是否会启动ContinueWith Action?或者它会排队并在以后开始?

这两个操作(ContinueWith()方法启动和Wait()线程恢复)可以按任何顺序发生。您可以确定的是,它们都是在taskConta Task完成后才发生的。

如果您想等到延续完成,可以等待Task返回的ContinueWith()


但您似乎也对Task关于异常的行为感到困惑。你在继续做什么是一个坏主意。在.Net 4.5中,它不会做任何事情,因为那里忽略了未观察到的Task的异常。在.Net 4.0中,当继续Task完成时会抛出异常,这意味着它将在未来某个未指定的点发生,并且您不能使用正常的Catch来处理除了。

此外,如果Wait()出现故障异常,则Wait()会引发AggregateException中包含的异常。这意味着如果您要处理Task中的特定例外,则可以使用Catch。例如:

Try
    taskConta.Wait()
Catch e as AggregateException
    If TypeOf e.InnerException Is SomeSpecificException
        Throw New TimeoutException("message", e.InnerException)
    Else
        Throw
    End If
End Try