1

を読んJeffrey Richter, CLR via C#でいるときに、この例を見つけました。に応じて新しいタスクを実行することが期待されますTaskContinuationOptionsが、そうではありません。次の結果が得られると思いました:

Finished, SUM=5050

しかし、関数を追加throw exceptionしても空の出力があり、実行されません。SumOnlyOnFaulted

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();            
    }
}

私が間違っているのは何ですか?

4

1 に答える 1

2

実際には継続を正しくセットアップしましたが、アプリケーションが前に存在するため、コンソールに結果が表示されません:

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

アプリケーションはバックグラウンド スレッドの完了を待機しません。アプリケーションのメイン スレッドが作業を終了すると閉じられます (メイン メソッド)。

EDIT別のオプションは、バックラウンド スレッド (継続スレッド) が完了するまで待機し、アプリケーションを存続させることです。

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
于 2013-08-02T09:22:54.140 に答える