0

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

我正在创建一个在创建时声明 continueWith 的任务,我没有将它分配给稍后将开始的第二个任务。

声明是这样的:

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 会在代码继续执行之前启动吗?还是会排队并稍后开始?

如果晚点开始,多长时间或少多长时间?这样做可以使 myThrow Exception超出范围。

我知道我可以做类似的事情:

  taskConta.Wait()

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

我想知道 TaskFactory continueWith 队列是如何工作的。

4

1 回答 1

0

如果我的任务退出失败并且我使用了.Wait(). ContinueWith Action 会在代码继续执行之前启动吗?还是会排队并稍后开始?

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

如果您想等到继续完成,您可以通过等待Task返回的 from来做到这一点ContinueWith()


Task但是您似乎也对异常的行为方式感到困惑。你在继续做的事情是个坏主意。在 .Net 4.5 中,它不会做任何事情,因为 unobservedTask的异常在那里被忽略。在 .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
于 2013-05-31T11:34:30.897 回答