2

次のようなfacebookクエリがあります

var client = new FacebookClient(accessToken);
var dynamic = client.Get(connection, new { fields = "name,from,story,message,picture,comments", limit = count});
foreach (var dynPost in results.data)
{
     posts.Add(ConvertToPost(dynPost));
}

私は、Facebook に対して多くの小さなリクエストを並行して行うことで、これをより迅速にしようとしています。

using (profilingService.Start("Facebook calls"))
{ 
    var pullSize = 25;
    var numberOfCalls = (int)Math.Ceiling(count / (double)pullSize);

    var taskQueue = new Queue<Task>();
    for (int i = 0; i < numberOfCalls; i++)
    {
        taskQueue.Enqueue(Task.Factory.StartNew(() =>
        {
            var offset = i * pullSize;
            var client = new FacebookClient(accessToken);
            return client.Get(connection, new { fields = "name,from,story,message,picture,comments", limit = 25, offset = offset });
        }));
    }

    Task.Factory.ContinueWhenAll(
        taskQueue,
        tasks =>
        {
            //t.Result here is giving me the error
            var results = tasks.Select(t => t.Result);
            foreach (var result in results)
            {
                foreach (var dynPost in result.data)
                {
                    posts.Add(ConvertToPost(dynPost.data));
                }
            }
        });
}

まず第一に、私はエラーが発生していますvar results = tasks.Select(t => t.Result);

エラー 361 'System.Threading.Tasks.Task' には 'Result' の定義が含まれておらず、タイプ 'System.Threading.Tasks.Task' の最初の引数を受け入れる拡張メソッド 'Result' が見つかりませんでした (ディレクティブまたはアセンブリ参照を使用していますか?)

t はタイプですTask<AntecedentResult>

このページにたどり着きましたが、まだ解決できていません。この非同期タスク メソッドの何が問題になっていますか?

また、この種の並列コーディングの経験はあまりありません。間違っていることや別の方法で行うべきことはありますか?

4

1 に答える 1

6

問題は、Queue<Task>. だけではプロパティTaskを持っていません。Resultただし、 typeTask<Foo>ResultプロパティがありますFoo。(何が返されるかわかりません。client.Get(...)とりあえず、次のように呼びましょうFoo

var taskQueue = new Queue<Task<Foo>>();

このメソッドは、 および のみをContinueWhenAllサポートしていないため、最初に配列に変換する必要があります。Queue<>Task[]Task<>[]

Task.Factory.ContinueWhenAll(
    taskQueue.ToArray(),
    tasks =>
    {
        var results = tasks.Select(t => t.Result);
        foreach (var result in results)
        {
            ...
        }
    });
}
于 2012-06-06T15:44:03.833 に答える