Maxim Zhukov
Maxim Zhukov

Reputation: 10140

Task.ContinueWith doesn't work after previous Task completed

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

Answers (1)

Sergey Berezovskiy
Sergey Berezovskiy

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

Related Questions