2

私の理解では、ContinueWith メソッドは問題のタスクが完了するのを待ちます。次のコードの場合、これは、子タスクが完了したときに終了したことを意味します。これが本当なら、0 0 0 と 0 1 2 を出力することがあるのはなぜですか?

    static void Main(string[] args)
    {

        Task<Int32[]> parent = Task.Run(() =>
            {
                var results = new Int32[3];
                new Task(() => results[0] = 0, TaskCreationOptions.AttachedToParent).Start();
                new Task(() => results[1] = 1, TaskCreationOptions.AttachedToParent).Start();
                new Task(() => results[2] = 2, TaskCreationOptions.AttachedToParent).Start();

                return results;
            });

        var finalTask = parent.ContinueWith(n =>
        {
            foreach (Int32 i in n.Result)
                Console.WriteLine(i);
        });

        finalTask.Wait();

        Console.ReadLine();

    }
4

1 に答える 1

3

http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspxから

Action を Task.Run に渡すと、次のようになります。

Task.Run(someAction);

これは次とまったく同じです:

Task.Factory.StartNew(someAction, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);

これは、子供たちが期待どおりに接続するのを止めるように見えます。

確かにスタートラインを変えて

Task<Int32[]> parent = Task.Factory.StartNew(() =>

問題を解決しているようです。の代わりにメソッドを使用するhttp://msdn.microsoft.com/en-us/library/dd997417(v=vs.110).aspxでの違いを見て、この結論に達しました。Factory.StartNewRun

InvalidOperationExceptionタスクをアタッチしようとすると、なぜスローされないのかわかりません...

于 2013-11-15T11:54:07.527 に答える