2

C# Facebook SDK を使用してアルバムの ID を取得しようとしています。ただし、次のエラーが表示されます。

System.Threading.Tasks.Task' には 'Result' の定義が含まれておらず、タイプ 'System.Threading.Tasks.Task' の最初の引数を受け入れる拡張メソッド 'Result' が見つかりませんでした

以下のコードを参照してください。エラーは foreach 行で発生します

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>

4

2 に答える 2

2

Facebook API はわかりませんが、エラーは、プロパティTaskを持たないクラス (非ジェネリック) をResult扱っていることを示しているようです。プロパティを持つのは、非ジェネリック クラスから派生したジェネリックTask<T>Taskです。どちらも非同期でコードを実行できますが、ジェネリック クラスは値を返すメソッドを実行できます。

GetTaskAsyncが返され、が返さTaskれない場合はTask<T>、バックグラウンドで実行される操作が何も返さないため、結果を取得できないことを意味します。

于 2013-05-20T06:40:46.880 に答える
1

あなたのコードをコンパイルすると、2 つのエラーが表示されます。最初のエラーはあなたが言及したエラーで、2 番目のエラーは次のとおりです。

「オブジェクト」には「データ」の定義が含まれておらず、タイプ「オブジェクト」の最初の引数を受け入れる拡張メソッド「データ」が見つかりませんでした

この 2 番目のエラーは実際の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 に答える