我有一个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?
另外,我对这种并行编码没有太多经验,我做错了什么或应该以不同的方式做什么?
答案 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)
{
...
}
});
}