2010-07-12 5 views

Répondre

3

Ajoutez un gestionnaire d'événements pour l'événement Application.Exit. Appelez le WebService dans ce gestionnaire. Le XAML/code ressemble à:

<Application 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Class="SilverlightApplication.App" 
    Exit="App_Exit"> 

</Application> 

Et

public partial class App : Application 
{ 
    private void App_Exit(object sender, EventArgs e) 
    { 
     // Code to call WebService goes here. 
    } 
} 
+0

dans les méthodes asynchrones webservice. Par exemple: méthode save(). Dans les services saveAsync(); et saveCompleted(). saveAsync est exécuté, mais saveCompleted ne s'exécute pas si vous utilisez votre réponse. – isxaker

+0

@Mikhail voulez-vous dire que vous n'obtenez pas l'événement de rappel? Comme c'est asynchrone, c'est probablement parce que votre application est déjà fermée avant le retour du service. Avez-vous besoin d'une valeur de retour? –

+0

Oui exactement .... – isxaker

0

Voir les commentaires sur la réponse de Justin Niessner: vous ne pouvez pas récupérer la valeur de retour. Cela peut vous convenir si le service que vous appelez n'est pas critique (parce que, disons, il capture simplement des statistiques d'utilisation). Si vous avez besoin de la valeur de retour dans tous les cas, et que vous pensez que l'application SL sera utilisée plusieurs fois, vous pouvez écrire un souvenir sur le IsolatedStorage (opération synchrone) et le publier sur le serveur lorsque l'application démarre. la prochaine fois.

2

Vous ne pouvez pas effectuer de requête Web lors de l'arrêt de l'application dans Silverlight.

2

J'avais une application qui avait besoin de sauvegarder des informations avant la fermeture. J'ai utilisé javascript dans la page hébergeant le contrôle silverlight.

Javascript et utilisation

<script type="text/javascript"> 
    var blocking = true; 

    function pageUnloading() { 
     var control = document.getElementById("Xaml1"); 
     control.content.Page.FinalSave(); 
     while (blocking) 
      alert('Saving User Information'); 
    } 

    function allowClose() { 
     blocking = false; 
    } 
</script> 


<body onbeforeunload="pageUnloading();"> 

</body> 

et App.xaml.cs

public partial class App : Application 
{ 

    [ScriptableMember()] 
    public void FinalSave() 
    { 

     srTL.TrueLinkClient proxy = new CSRM3.srTL.TrueLinkClient(); 
     proxy.DeleteAllUserActionsCompleted += (sender, e) => 
      { 
       HtmlPage.Window.CreateInstance("allowClose"); 


      }; 
     proxy.DeleteAllUserActionsAsync(ApplicationUser.UserName); 

    } 

} 
+0

le javascript tandis que le bloc se lève sur différents navigateurs d'alerte, que le script qui est en cours d'exécution est hors de contrôle ... A part cela, cela semble fonctionner – Rumplin

0

Oui, il suffit de faire l'appel de service Web et ne pas attendre une valeur de retour .. car il ne sera jamais arriver

donc faire:

private async void Application_Exit(object sender, EventArgs e) 
    { 
     // Tell DBSERVER_V14 pipe we have gone away 
     await connect_disconnect_async(MainPage.username, MainPage.website, false); 
    } 

Mais ne le faites pas ceci:

private async void Application_Exit(object sender, EventArgs e) 
    { 
     // Tell DBSERVER_V14 pipe we have gone away 
     var status = await SmartNibby_V13.connect_disconnect_async(MainPage.username, MainPage.website, false); 
     if (status) 
     { 
      Console.WriteLine(status); 
     } 
    } 

parce que vous aurez jamais une valeur « d'état » avec pour tester.

Questions connexes