我正在使用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如何继续使用队列。
答案 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