访问任务的“结果”属性

本文关键字:属性 结果 任务 访问 | 更新日期: 2023-09-27 18:14:36

我正在尝试使用c# Facebook SDK检索专辑的ID。然而,我得到以下错误:

System.Threading.Tasks。Task'不包含'Result'的定义,也没有扩展方法'Result'接受类型为'System.Threading.Tasks '的第一个参数。可以找到任务

请查看下面的代码,每行

前出现错误
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;
}

对于记录,FacebookClient.GetTaskAsync方法返回Task<object>

访问任务的“结果”属性

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

如果GetTaskAsync返回Task而不是Task<T>,那么这意味着你不能从它那里得到结果,因为它在后台运行的操作不返回任何东西

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

'object'不包含'data'的定义,并且找不到接受'object'类型的第一个参数的'data'扩展方法

第二个错误是您的实际错误:task.Resultobject,但(我假设)您想将其视为dynamic。由于这个错误,编译器还尝试使用ContinueWith()的重载,它只使用Task,而不是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,那么你的整个方法应该返回由ContinueWith()返回的Task<string>:

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