I have the following code in C#, VS2012, WPF 4.5.
My expectation would be that, .ContinueWith
will be executed after the task has finished completely (that's a continuation's whole purpose, isn't it?).
This should result in a value of 2 in finalResult
.
int myTestInt = 0;
Task task = Task.Factory.StartNew(async () =>
{
myTestInt = 1;
await Task.Delay(TimeSpan.FromSeconds(6));
myTestInt = 2;
}).ContinueWith(_ =>
{
int finalResult = myTestInt;
});
In fact, finalResult
is assigned a value of 1 instead. So it seems like the continuation is started on the await
statement already.
Is this the intended behaviour? Am I missing something here? Can't I rely on ContinueWith
to start after a task has completely finished?
Update:
Justin's answer just inspired me to check the following:
int myTestInt = 0;
Task task=Task.Factory.StartNew(async () =>
{
myTestInt = 1;
await Task.Delay(TimeSpan.FromSeconds(6));
myTestInt = 2;
});
task.Wait();
int result2 = myTestInt;
finalResult is still set to 1. Is there no way to reliably wait for a task that contains await
s to complete?
Task. WhenAll doesn't start tasks. The general pattern is that methods that return a Task , return a hot Task .
C# wait is called that as it waits for the task to finish its execution. Beginners will learn about Wait (TimeSpan), Wait (CancellationToken), Wait (Int32), Wait (Int32, CancellationToken), and Wait for overloads in this tutorial.
A continuation task (also known just as a continuation) is an asynchronous task that's invoked by another task, known as the antecedent, when the antecedent finishes.
ContinueWith(Action<Task,Object>, Object, TaskScheduler)Creates a continuation that receives caller-supplied state information and executes asynchronously when the target Task completes.
When you pass an async
delegate to Task.Factory.StartNew
, the returned Task
only represents the first portion of that delegate (up until the time it await
s something that is not already completed).
However, if you pass an async
delegate to the new Task.Run
method (which was included for this reason), the returned Task
represents the entire delegate. So you can use ContinueWith
as you expect. (Although await
is usually a better option than ContinueWith
).
For more information on StartNew
vs Run
, see Stephen Toub's post on the topic.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With