0

次のコードがある場合

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication3
{
    class Program
    {
        static Task<int> GetSuperLargeNumber()
        {
            var main = Task.Factory.StartNew(() =>
                                                 {
                                                     Thread.Sleep(1000);
                                                     return 100;
                                                 });
            var second = main.ContinueWith(x => Console.WriteLine("Second: " + x.Result), TaskContinuationOptions.AttachedToParent);
            var third = main.ContinueWith(x => Console.WriteLine("Third: " + x.Result), TaskContinuationOptions.AttachedToParent);

            return main.ContinueWith(x  =>
                                             {
                                                 Task.WaitAll(second, third);
                                                 return x.Result;
                                             });
        }

        static void Main(string[] args)
        {
            GetSuperLargeNumber().ContinueWith(x => Console.WriteLine("Complete"));

            Console.ReadKey();
        }
    }
}

mainを最初に開始し、次に2つの依存関係を開始し、その後に1番目と2番目の依存関係を並行して開始できます。次に、呼び出し元が継続を追加するための値を含むfutureを返します。ただし、2番目と3番目が最初に実行されていることを確認したいと思います。以下のコードはこれを達成するための最良の方法ですか?ちょっと不格好そうです

4

2 に答える 2

3

私はTPLにあまり詳しくありませんが、これは何ContinueWhenAllのためですか?

static Task<int> GetSuperLargeNumber()
{
    var main = Task.Factory.StartNew(() =>
                                         {
                                             Thread.Sleep(1000);
                                             return 100;
                                         });
    var second = main.ContinueWith(
        x => Console.WriteLine("Second: " + x.Result),
        TaskContinuationOptions.AttachedToParent);
    var third = main.ContinueWith(
        x => Console.WriteLine("Third: " + x.Result),
        TaskContinuationOptions.AttachedToParent);

    return Task.Factory.ContinueWhenAll(
        new[] { second, third },
        (twotasks) => /* not sure how to get the original result here */);
    }

完成したand ( に含まれる)mainから の結果を取得する方法はわかりませんが、結果を通過するように変更できるかもしれません。secondthirdtwotasks

編集:または、アレックスが指摘するように、使用

Task.Factory.ContinueWhenAll(new[] { main, second, third }, (threetasks) => ...

から結果を読み取りますthreetasks[0]

于 2013-01-17T08:58:57.847 に答える
0

これで十分です:

static Task<int> GetSuperLargeNumber()
{
    var main = Task.Factory.StartNew<int>(() =>
    {
        Thread.Sleep(1000);
        return 100;
    });
    var second = main.ContinueWith(x => Console.WriteLine("Second: " + x.Result), TaskContinuationOptions.AttachedToParent);
    var third = main.ContinueWith(x => Console.WriteLine("Third: " + x.Result), TaskContinuationOptions.AttachedToParent);

    Task.WaitAll(second, third);

    return main;
}
于 2013-01-17T09:05:14.543 に答える