0

TaskFactory を使用してタスクを宣言していますが、深刻な疑問があります。

作成時に continueWith を宣言するタスクを作成していますが、後で開始される 2 番目のタスクにも割り当てていません。

宣言は次のようになります。

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 アクションが開始されますか? それとも、キューに入れられて後で開始されますか?

後で開始する場合、多かれ少なかれどのくらいの時間がかかりますか? これThrow Exceptionにより、スコープ外に起動することができます。

私は次のようなことができることを知っています:

  taskConta.Wait()

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

TaskFactory continueWith キューがどのように機能するか知りたいですか。

4

1 に答える 1

0

タスクが失敗して終了し、使用した場合.Wait()。コードが実行を継続する前に、ContinueWith アクションが開始されますか? それとも、キューに入れられて後で開始されますか?

2 つのアクション (ContinueWith()メソッドの開始とWait()ing スレッドの再開) は、任意の順序で実行できます。確認できるのは、両方ともtaskConta Task完了後にのみ発生するということだけです。

継続が完了するまで待ちたい場合は、Task返された fromを待つことで実行できますContinueWith()


Taskしかし、例外に関してどのように振る舞うかについても混乱しているようです。あなたの継続であなたがしていることは悪い考えです。Task.Net 4.5 では、監視されていないs からの例外はそこで無視されるため、何もしません。.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 に答える