2013-05-31 1 views
0

TaskFactory를 사용하여 작업을 선언하고 있으며 심각한 의문을 가지고 있습니다.Task.Factory.StartNew --Wait()을 사용하여 계속 진행합니다.

생성시 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을 시작합니까? 대기열에 넣고 나중에 시작하겠습니까?

나중에 시작하는 경우 어느 정도 소요됩니까? 그럴 수 내 Throw Exception 범위 밖으로 시작할 수 있습니다. 나는 TaskFactory continueWith 큐가 작동하는 방법을 알고 싶습니다시겠습니까

taskConta.Wait() 

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

:

나는 내가 좋아하는 뭔가를 할 수 알고있다.

답변

0

내 작업이 오류로 종료되고 .Wait()을 사용한 경우. 코드를 계속 실행하기 전에 ContinueWith Action을 시작합니까? 또는 대기열에 넣고 나중에 시작하겠습니까?

두 가지 동작 (ContinueWith() 메서드 시작 및 Wait() 시작 스레드 다시 시작)은 임의의 순서로 발생할 수 있습니다. 확실한 사실은 모두 taskContaTask이 완료된 후에 만 ​​발생한다는 것입니다.

계속 진행이 완료 될 때까지 기다리려면 ContinueWith()에서 반환 된 Task을 기다려야합니다.


그러나 당신은 또한 보이지는 예외에 관해서 어떻게 Task없이 행동에 대해 혼란스러워한다. 당신이 계속하고있는 일은 나쁜 생각입니다. .Net 4.5에서는 관찰되지 않은 Task의 예외가 무시되므로 아무 것도하지 않습니다. .Net 4.0에서 예외가 구체화 될 때 Task이 완료되면 예외가 발생합니다. 즉, 나중에 특정 지정되지 않은 지점에서 발생하며 예외를 처리하기 위해 보통 Catch을 사용할 수 없음을 의미합니다.

또한 오류가있는 예외의 경우 Wait()AggregateException에 포함 된 예외를 throw합니다.즉, 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