2010-01-17 6 views
0
de manière asynchrone

Je suis nouveau à l'API de données YouTube, ainsi que C#. Je veux rechercher la vidéo et afficher le résultat dans un listview et je l'ai fait mais je ne peux pas le faire de manière asynchrone. J'ai cherché et essayé beaucoup mais je me retrouve avec rien.vidéo de recherche sur youtube C#

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

S'il vous plaît aidez-moi.

+0

Que voulez-vous dire par asynchrone? Asynchrone par rapport au client ou asynchrone par rapport au serveur? Ce sont deux choses complètement différentes. Autrement dit, essayez-vous de rendre l'application plus vive et plus épurée pour l'utilisateur ou essayez-vous de conserver les ressources du serveur? – Eilon

Répondre

2

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

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

  • rapetisser, paginés demandes, et ne les tirer hors que vos utilisateurs de faire défiler les résultats et vous n'en avez plus à afficher. Cela signifie qu'il y a moins de travail à faire sur chaque requête et que votre interface utilisateur sera moins susceptible de se verrouiller.
  • 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 garantira que votre interface utilisateur reste réactive quelle que soit la latence du serveur.
  • Vous pouvez également utiliser un cadre fondé sur des événements (un cadre qui met en œuvre le reactor pattern) pour faire les demandes. Dans de tels cadres, vous lancez une requête et recevez un rappel avec les résultats, ce qui vous permet de faire d'autres choses entre-temps. En vertu de ce modèle, vous n'avez pas besoin de mutex pour protéger les données partagées (utilisées lors de l'enfilage) contre la complexité (sans doute) ajoutée du modèle de rappel.

[edit: pour .NET Je vois que might not be such a good candidate for the reactor based approach]

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.

1

Ne peut 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 link.

Ok Alors avez-vous fait quelque chose de votre appel async 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. Donc, à la place, nous devons structurer le programme d'une manière que nous vérifions pour voir si c'est fait sur une mise à jour séparée. Cela permet à Win-forms ou à GTK de s'exécuter pour qu'il ne semble pas bloqué. MALHEUREUSEMENT, c'est une douleur dans la crosse. Ce que vous voulez probablement faire, c'est juste utiliser un travailleur d'arrière-plan. Lisez cette partie HERE et si cela ne vous aide pas plus parce que BackgroundWorkers peuvent avoir callbacks. Ensuite, tout ce que vous avez à faire est de mettre en place un travailleur d'arrière-plan, puis connectez votre fonction de mise à jour dans l'événement terminé.

+0

Je l'ai utilisé mais l'opération est toujours en retard sur l'application :(. –

Questions connexes