'System.Threading.Tasks.Task'不包含'Result'的定义

时间:2012-06-06 14:19:26

标签: asp.net asp.net-mvc-3 asp.net-4.0

我有一个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'不包含定义   对于'结果'而没有扩展方法'结果'接受第一个   可以找到'System.Threading.Tasks.Task'类型的参数(是吗?   缺少using指令或程序集引用?)

t类型为Task<AntecedentResult>

这导致我进入此页面,但仍无法解决此问题。 What's wrong with this async Task method?

另外,我对这种并行编码没有太多经验,我做错了什么或应该以不同的方式做什么?

1 个答案:

答案 0 :(得分:6)

问题是Queue<Task>。仅Task没有Result属性。但是,Task<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)
        {
            ...
        }
    });
}