none
Problème pour charger une liste dans un datagrid avec et la fonction en mode Async de Sqlite RRS feed

  • Question

  • Bonjour,

    Dans une application WPF et sqlite-net-pcl, Je n'arrive pas à charger une liste dans un datagrid avec sqlite-net-pcl en mode Async.

     SQLiteAsyncConnection connection = new SQLiteAsyncConnection(Cache.ConnectionString);

     Article NewArticle = new Article() { Nom = "V00888/A", DateCreation = DateTime.Now };
     connection.InsertAsync(NewArticle);
     var requete = connection.Table<Article>().ToListAsync();
     DataGrid1.ItemsSource = requete;


    j'ai le message suivant : Erreur S0266    Impossible de convertir implicitement le type 'System.Threading.Tasks.Task<System.Collections.Generic.List<Lib.Modeles.Article>>
    ' en 'System.Collections.IEnumerable'. Une conversion explicite existe (un cast est-il manquant ?)

    Sans le mode Async ça fonctionne avec le code ci-dessous.

     using (SQLiteConnection connection = new SQLiteConnection(Cache.ConnectionString))
          {
            
           Article n = new Article() { Nom = "V00888/A", DateCreation = DateTime.Now };
           connection.Insert(n);
            DataGrid1.ItemsSource = connection.Table<Article>().ToList();
          }

    Merci pour votre aide.

           

    pascal

    lundi 26 août 2019 09:03

Réponses

  • Bonjour Fred, 

    je t'en pris, pour utiliser la methode en mode async "avec le mots cle await" il faut que la methode qui fais l'appel soit aussi une methode async comme ceci :

    /* si la methode n'a pas de valeur de retour alors tu dois avoir
       cette signature
       public async Task TraitementArticleAsync(){
       }
       autrement si tu dois avoir une valeur de retour, dans ce cas 
       il faut l'utiliser comme parametre generique du type Task<> */
    public async Task<IEnumerable<Article>> GetArticlesAsync(){
        SQLiteAsyncConnection connection = new 
        SQLiteAsyncConnection(Cache.ConnectionString);
    
        Article NewArticle = new Article() { Nom = "V00888/A", 
            DateCreation = DateTime.Now };
        connection.InsertAsync(NewArticle);
        var requete = await connection.Table<Article>().ToListAsync();
        //..... 
        return requete;
    }

    Cordialement,

    Mouad.

     


    mercredi 28 août 2019 18:54

Toutes les réponses

  • Bonjour Fred,

    lors de l'appel d'une methode async on en retour une tache, dans notre cas de type Task<List<Article>>, et donc pour avoir le resultat de la tache en question on a deux cas de figure, ou bien on appel la methode Async avec le mots cle await:

     SQLiteAsyncConnection connection = new SQLiteAsyncConnection(Cache.ConnectionString);
    
     Article NewArticle = new Article() { Nom = "V00888/A", DateCreation = DateTime.Now };
     connection.InsertAsync(NewArticle);
     var requete = await connection.Table<Article>().ToListAsync();
    // dans ce premier cas de figure ta methode dois etre async 
    // ou bien 
    var requete = connection.Table<Article>().ToListAsync().Result;
    //
     DataGrid1.ItemsSource = requete;

    Cordialement,

    Mouad.

     
    mercredi 28 août 2019 01:39
  • Bonjour Mouad,

    Merci pour ton aide !

    Ça fonctionne très bien avec :

    var requete = connection.Table<Article>().ToListAsync().Result;

    Mais la première solution ne fonctionne pas, j'ai le message suivant :

    Bien cordialement.

    Fred


    pascal

    mercredi 28 août 2019 16:50
  • Bonjour Fred, 

    je t'en pris, pour utiliser la methode en mode async "avec le mots cle await" il faut que la methode qui fais l'appel soit aussi une methode async comme ceci :

    /* si la methode n'a pas de valeur de retour alors tu dois avoir
       cette signature
       public async Task TraitementArticleAsync(){
       }
       autrement si tu dois avoir une valeur de retour, dans ce cas 
       il faut l'utiliser comme parametre generique du type Task<> */
    public async Task<IEnumerable<Article>> GetArticlesAsync(){
        SQLiteAsyncConnection connection = new 
        SQLiteAsyncConnection(Cache.ConnectionString);
    
        Article NewArticle = new Article() { Nom = "V00888/A", 
            DateCreation = DateTime.Now };
        connection.InsertAsync(NewArticle);
        var requete = await connection.Table<Article>().ToListAsync();
        //..... 
        return requete;
    }

    Cordialement,

    Mouad.

     


    mercredi 28 août 2019 18:54
  • Bonjour Mouad,

    Encore merci pour ces explications !

    Bien cordialement

    Fred


    pascal

    jeudi 29 août 2019 15:04
  • Bonjour Fred,

    je t'en pris, c'etait vraiment une joie de partager ces petits infos!  

    Cordialement,

    Mouad.

    jeudi 29 août 2019 18:21