2

I am trying to retrieve the ID of an album using the C# Facebook SDK. However I am getting the below error:

System.Threading.Tasks.Task' does not contain a definition for 'Result' and no extension method 'Result' accepting a first argument of type 'System.Threading.Tasks.Task' could be found

Please see the below code, the error occurs on the foreach line

try
{
    string wallAlbumID = string.Empty;
    FacebookClient client = new FacebookClient(accessToken);
    client.GetTaskAsync(pageID + "/albums")
        .ContinueWith(task =>
            {
                if (!task.IsFaulted)
                {
                    foreach (dynamic album in task.Result.data)
                    {
                        if (album["type"] == "wall")
                        {
                            wallAlbumID = album["id"].ToString();
                        }
                    }
                }
                else
                {
                    throw new DataRetrievalException("Failed to retrieve wall album ID.", task.Exception.InnerException);
                }
            });
    return wallAlbumID;
}

For the record, the FacebookClient.GetTaskAsync method returns Task<object>

4

2 回答 2

2

我不知道 Facebook API,但错误似乎表明,您正在处理的Taskclass (non-generic) 没有Resultproperty。它是从具有属性的非泛型类派生的泛型Task<T>Task。它们都允许异步运行代码,但泛型类能够运行返回值的方法。

如果GetTaskAsync返回Task而不返回Task<T>,则意味着您无法从中获取结果,因为它在后台运行的操作不会返回任何内容。

于 2013-05-20T06:40:46.880 回答
1

当我编译你的代码时,我得到两个错误,第一个是你提到的那个,第二个是:

“对象”不包含“数据”的定义,并且找不到接受“对象”类型的第一个参数的扩展方法“数据”

第二个错误是您的实际错误:task.Result是一个object,但是(我假设)您想将其视为dynamic. 由于这个错误,编译器还尝试ContinueWith()使用 just Task, not的重载Task<object>,这就是为什么你也会得到第一个错误。

要修复此错误,您应该task.Result转换为dynamic

dynamic result = task.Result;
foreach (dynamic album in result.data)

这将编译得很好,但实际上并不能正常工作,因为您在从封闭方法返回后设置了局部变量。

如果您使用的是 C# 5.0,则应await在此处使用,而不是ContinueWith()

try
{
    dynamic result = await client.GetTaskAsync(pageID + "/albums");
    foreach (dynamic album in result.data)
    {
        if (album["type"] == "wall")
        {
            return (string)album["id"].ToString();
        }
    }
    return string.Empty;
}
catch (Exception e) // you should use a specific exception here, but I'm not sure which
{
    throw new DataRetrievalException("Failed to retrieve wall album ID.", e);
}

如果你不能使用 C# 5.0,那么你的整个方法应该返回一个Task<string>由返回的ContinueWith()

return client.GetTaskAsync(pageID + "/albums")
      .ContinueWith(
          task =>
          {
              if (!task.IsFaulted)
              {
                  dynamic result = task.Result;
                  foreach (dynamic album in result.data)
                  {
                      if (album["type"] == "wall")
                      {
                          return (string)album["id"].ToString();
                      }
                  }
                  return string.Empty;
              }
              else
              {
                  throw new DataRetrievalException(
                      "Failed to retrieve wall album ID.", task.Exception.InnerException);
              }
          });
于 2013-05-20T13:44:21.357 回答