Reputation: 10140
While i read Jeffrey Richter, CLR via C#
, i've found this example. There are expected executing new Tasks depending on TaskContinuationOptions
, but it isn't. I thought i would have next result:
Finished, SUM=5050
but i have empty output, even if i add throw exception
in Sum
function, OnlyOnFaulted
wouldn't be executed.
class Program
{
public static Int32 Sum(Int32 n)
{
Int32 Sum = 0;
for (; n > 0; n--)
Sum += n;
return Sum;
}
static void Main(string[] args)
{
Task<Int32> t = new Task<Int32>(n => Sum((Int32)n), 100);
t.ContinueWith(tt => Console.WriteLine("Finished, SUM={0}", tt.Result), TaskContinuationOptions.OnlyOnRanToCompletion);
t.ContinueWith(tt => Console.WriteLine("Exception thrown"), TaskContinuationOptions.OnlyOnFaulted);
t.Start();
}
}
What i'm doing wrong?
Upvotes: 1
Views: 2592
Reputation: 236318
Actually you setup continuation correctly, but you can't see result on console, because application exists before:
Task<Int32> t = new Task<Int32>(n => Sum((Int32)n), 100);
t.ContinueWith(tt => Console.WriteLine("Finished, SUM={0}", tt.Result),
TaskContinuationOptions.OnlyOnRanToCompletion);
t.ContinueWith(tt => Console.WriteLine("Exception thrown"),
TaskContinuationOptions.OnlyOnFaulted);
t.Start();
Console.ReadKey(); // keep app alive
Application will not wait for background thread completion - it will be closed when main thread of application finishes it's work (your Main method)
EDIT Another option is to wait until backround thread (continuation thread) completes and keep application alive:
Task continuation =
t.ContinueWith(tt => Console.WriteLine("Finished, SUM={0}", tt.Result),
TaskContinuationOptions.OnlyOnRanToCompletion);
t.Start();
continuation.Wait(); // wait until continuation of task finishes
// exit application
Upvotes: 2