2010-03-05 8 views
2

J'ai un code qui fonctionne comme suit:Silverlight et des problèmes avec appel async

App.xaml appelle une méthode setUp() qui alimente une collection locale en utilisant des appels et expose async la collection comme une propriété publique.

Tout va bien.

Maintenant, je fais une instance de la première page dans mon application Silverlight comme si

private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     this.RootVisual = new Summary(); 
    } 

Dans le constructeur Résumé() J'attends les appels asynchrones avoir été complète et ma collection à remplir, mais la les appels asynchrones ne sont pas encore terminés. Même si je fais un Thread.Sleep (100000 ....) avant de faire une instance sur Summary() c'est le cas

Et la chose est que jusqu'à ce que le constructeur de Summary() soit quitté et l'interface utilisateur affichée à l'utilisateur mes appels asynchrones ne sont pas expulsés!

Quoi !!!

Y a-t-il quelque chose que je peux faire à ce sujet ou est-ce que c'est exactement comme ça que les appels asyn fonctionnent, c'est-à-dire qu'ils attendent que le courant soit terminé avant le déclenchement?

Répondre

0

Silverlight a été spécifiquement conçu pour ne pas avoir d'opérations de blocage - c'est pourquoi vous devez d'abord effectuer une opération asynchrone. Ce que vous devez faire est de faire fonctionner votre application correctement en attendant l'exécution du gestionnaire d'achèvement asynchrone.

0

Ceci est voulu. L'alternative serait que l'utilisateur doit attendre plus longtemps avant de voir quoi que ce soit.

Si vous voulez vraiment éviter d'afficher un résumé incomplet, affichez d'abord une autre page avec «attente» ou une barre de progression. Lancez les événements asynchrones de cette page ou de son parent. Ensuite, affichez le résumé lorsque l'appel asynchrone revient.

Pour faire face à un incomplet Résumé vous pouvez utiliser ICommand

1

Voilà comment je travaille autour de cette situation (je vais utiliser le téléchargement simple chaîne comme un exemple): -

private void Application_Startup(object sender, StartupEventArgs e) 
{ 
    WebClient web = new WebClient(); 
    web.DownloadStringCompleted += (s, args) => 
    { 
     // Do stuff with args.Result); 
     this.RootVisual = new Summary(); 
    }; 
    web.DownloadStringAsync(new Uri("SomeUrl.txt", UriKind.Relative)); 
} 

Remarque que la construction de Summary et l'affectation à RootVisual sont différées jusqu'à ce que le téléchargement asynchrone soit terminé.

0

Je sais que c'est un vieux fil, mais pour tous les lecteurs suivants, je veux fournir mon expérience avec un problème similaire. Si je vous ai bien compris, la raison pour laquelle vos appels asynchrones ne sont pas terminés est que vous bloquez le thread principal. J'ai rencontré le même problème, si vous bloquez le thread principal, aucun des autres threads ne continue. La solution consistait à faire des appels asynchrones à l'intérieur d'un arrière-plan et à montrer, comme disait pauldendulk, une page d'attente. Utilisez Debug.WriteLine() pour surveiller le processus dans la sortie.

Questions connexes