Question

Je suis nouveau à l'API de données YouTube, ainsi que C #. Je veux chercher la vidéo et afficher le résultat dans un listview et je l'ai fait, mais je ne l'ai fait de manière asynchrone. Je l'ai cherché et essayer beaucoup, mais finissent avec rien.

http://google-gdata.googlecode.com/svn /docs/folder48/Multithreadedoperations.html

S'il vous plaît aidez-moi.

Était-ce utile?

La solution

La plupart des API WebService (en particulier les Ful) ne fournissent pas un moyen pour récupérer async résultats, car en général, ils essaient de rester apatride: Je crois que l'API Youtube ne fait pas exception.

Au lieu de cela, vous aurez besoin de se pencher sur les méthodes traditionnelles pour simuler des demandes async, comme l'un des éléments suivants:

  • petits, les demandes de page, et ne les tirer au large que vos utilisateurs de faire défiler les résultats et vous avez pas laissé à afficher. Cela signifie qu'il ya moins de travail à faire sur chaque demande et votre interface utilisateur sera moins susceptible de bloquer.
  • Même si vous faites cela, vous pouvez utiliser un fil dédié à prendre soin d'aller chercher les résultats et les réinjecter au thread responsable de la mise à jour de votre interface utilisateur. Cela permettra d'assurer votre interface utilisateur continue à répondre quel que soit le temps de latence du serveur.
  • En variante, utiliser un événement basé cadre (un cadre qui implémente les ) à faire les demandes. Dans ces cadres vous tirez hors d'une demande et obtenir un rappel des résultats, ce qui vous permet de faire d'autres choses dans l'intervalle. Selon ce modèle vous négociez de la nécessité pour les mutex pour protéger les données partagées (utilisés lors de l'enfilage) contre le (sans doute) ajouté à la complexité du modèle de rappel.

[edit: pour .NET Je vois que pourrait ne pas être un bon candidat pour l'approche réacteur ]

Il n'y a rien de spécial à propos de YouTube à cet égard. Vous pourriez employer les mêmes techniques lors de la récupération de grands résultats de la plupart des API

Autres conseils

ne pouvez pas vous envelopper toute méthode non async dans un appel asynchrone à l'aide des délégués asynchrones? Ma référence est cette de .

Ok Alors avez-vous votre appel async quelque chose comme ça ...

private delegate <returnType> YouTubeAPI( <args> )
private YouTubeAPI func;
private IAsyncResult ticket;

void YouTubeSearchFunc( string what )
{
    func = <whatever the you tube call is>
    ticket = func.BeginInvoke( <args needed> );
    // WE MUST do this in order to return flow of control to program
    return;
}

// later we need to check if the ticket is done and then get it
if ( ticket.IsComplete == true )
    // get it
else
    // continue on like normal

La raison pour laquelle nous ne pouvons pas simplement obtenir immédiatement la valeur est parce que cela va bloquer le programme. C'est exactement ce que nous ne voulons pas faire. Ainsi, au lieu, nous devons structurer le programme d'une manière que nous vérifions pour voir si son fait sur une mise à jour séparée. Cela permet à Win-formes ou d'exécuter GTK afin qu'il ne ressemble pas à elle se bloque. Malheureusement, cela est une douleur dans le cul. Ce que vous voulez sans doute faire est d'utiliser juste un travailleur de fond. Lisez cette partie ICI et voir si cela ne vous aide pas plus parce que BackgroundWorkers peut avoir callbacks. Ensuite, tout ce que vous avez à faire est de mettre en place un travailleur de fond, puis accrochez votre fonction de mise à jour dans l'événement terminé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top