2017-03-25 1 views
3

JeOù puis-je me tromper en retournant un IEnumerable <T> à partir d'une méthode asynchrone?

public static async Task<IEnumerable<ParseTask>> GetArchiveTodos() 
    { 
     using(SqlConnection connection = new SqlConnection(SharedInfo.ConnectionString)) 
     using(SqlCommand command = new SqlCommand("GetArchiveTodos", connection)) 
     { 
      command.CommandType = CommandType.StoredProcedure; 
      await connection.OpenAsync(); 
      SqlDataReader row = await command.ExecuteReaderAsync(); 
      while(await row.ReadAsync()) 
      { 
       ParseTask pageToParse = new ParseTask() 
       { 
        Id = row.GetInt32(0), 
        PageType = row.GetString(1), 
        Html = row.IsDBNull(2) ? null : row.GetString(2), 
        ThreadId = row.IsDBNull(3) ? null : (int?)row.GetInt32(3), 
        PageNum = row.GetInt32(4) 
       }; 
       yield return pageToParse; 
      } 
     } 
    } 

et je reçois l'erreur

Code de gravité Description du projet État Suppression de la ligne de fichier Erreur CS1624 Le corps de 'ArchiveDb.GetArchiveTodos() ne peut pas être un iterator bloc parce que 'la tâche>' est pas un type d'interface iterator

+5

Vous ne pouvez pas avoir de méthodes asynchrones avec le bloc d'itération ('yield'), car le type de retour requis pour le bloc d'itérateur est' IEnumerable', pas 'Task'. – Evk

Répondre

1

Où vais-je me tromper en retournant un IEnumerable à partir d'une méthode asynchrone?

Ceci n'est simplement pas supporté. Vous ne pouvez pas avoir une méthode de retour Task<IEnumerable<T>> pour être un itérateur, c'est-à-dire; vous ne pouvez pas utiliser le mot-clé yield. Il y a eu des propositions pour ce here, mais cela n'a pas encore été pris en charge. Le type de retour requis pour un itérateur est IEnumerable et non Task - comme Evk l'a indiqué dans un commentaire.