2013-05-20 2 views
0

Я пытаюсь получить идентификатор альбома с помощью SDK C# Facebook. Однако я получаю ошибку ниже:Доступ к результату свойства задачи

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

Пожалуйста, смотрите ниже код, ошибка происходит на Еогеасп линии

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>

+0

Если вы отлаживать код и посмотреть на тип во время выполнения «задачи», вы можете обнаружить, что является производным от типа задач, и вы можете просто нужно сделать бросок, например, '((SomeFacebookTaskType)) .Result' – joshuahealy

ответ

1

Когда я компиляции кода, я получаю две ошибки, то первый из них является тот, который вы упомянули, а второй из них:

'object' does not contain a definition for 'data' and no extension method 'data' accepting a first argument of type 'object' could be found

Это вторая ошибка фактическая ошибка: task.Result является object, но (я полагаю) вы хотите рассматривать его как 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, то весь ваш метод должен возвращать 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); 
       } 
      }); 
0

Я надеваю Не знаю API Facebook, но ошибка, похоже, указывает на то, что вы имеете дело с Task class (non-generic) which does not have Result property. Это the generic Task<T> derived from non-generic Task class that has the property. Оба они позволяют запускать код асинхронно, но общий класс способен запускать методы, возвращающие значения.

Если GetTaskAsync возвращает Task, а не Task<T>, значит, вы не можете получить от него результат, так как операция, выполняемая в фоновом режиме, ничего не возвращает.

+0

Собственно, сообщение об ошибке предлагает это, но на самом деле это не так. – svick

Смежные вопросы