Take a look at type t2 . This is a Task<Task> . t2 will be completed when it finishes completing the task performing the actual work, when this work is not completed.
The smallest change to your code to make it work would be to add unwrap after the second and third calls to ContinueWith so that you select a task that represents the completion of your work.
A more idiomatic solution would be to simply remove ContinueWith calls completely and just use await to add continuations to tasks.
Interestingly, you would see the same behavior for t1 if you used Task.Factory.StartNew , but Task.Run specifically designed to work with async lambdas and actually expands all Action<Task> delegates internally to return the result of the returned task, and not the task that represents the launch of this task, so you do not need to deploy this task.
Servy source share