2012-06-06 59 views
2

我有一个Facebook的查询是通过使许多小的请求如下“System.Threading.Tasks.Task”不包含“结果”

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?

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

回答

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) 
     { 
      ... 
     } 
    }); 
}