3

Je fais des appels à un service WCF à partir de mon application Silverlight. Je le fais de manière asynchrone et je ne bloque pas l'exécution après avoir effectué l'async. appel (cela signifie que je n'utilise pas le mécanisme wait-join frm this page). Je ne veux pas que le flux soit bloqué.Comment détecter les appels wcf asynchrones en attente?

Cependant, je voudrais détecter que l'appel WCF est entré dans un état d'attente afin que je puisse montrer une icône occupée sur l'interface utilisateur - une communication visuelle indiquant que les choses se passent derrière l'interface utilisateur.

Je peux changer mon code de telle sorte que je puisse commencer à animer l'icône occupée et arrêter cette animation lorsque l'appel asynchrone est terminé. Cependant, il y a beaucoup de code bolierplate, et avec plus d'appels effectués à travers le code client, cela ne va que devenir plus compliqué. Donc, y at-il une méthode ou une propriété exposée par le code de référence du client de service wcf qui peut être utilisée pour déclencher des événements lorsque des appels de service async wcf passent en état d'attente, et déclenchent également des événements lorsque le tout asynchrone Les appels de service wcf se terminent-ils?

+0

J'utilise un wrapper singleton sur la référence client wcf générée automatiquement, donc je travaille toujours avec la même instance du client wcf. Il y a une propriété statique dans mon fichier app.xaml.cs qui expose ce singleton dans toute l'application. –

Répondre

4

Il n'y a pas de propriété ou d'événement sur la classe de référence client générée pouvant être utilisée pour identifier qu'un appel asynchrone à une méthode d'un service WCF Silverlight est actuellement en cours. Vous pouvez l'enregistrer vous-même en utilisant une simple variable booléenne, ou en utilisant la synchronisation de thread bloquante que vous avez mentionné que vous voulez éviter dans ce cas.

Voici un exemple de la façon de faire ce que vous voulez à l'aide du Silverlight ProgressBar control pour indiquer attente/travail sur un appel à un service Web Silverlight très simple:

Page.xaml:

<UserControl x:Class="SilverlightApplication1.Page" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="100"> 

    <StackPanel x:Name="LayoutRoot" Background="White"> 
     <Button x:Name="ButtonDoWork" Content="Do Work" 
       Click="ButtonDoWork_Click" 
       Height="32" Width="100" Margin="0,20,0,0" /> 
     <ProgressBar x:Name="ProgressBarWorking" 
        Height="10" Width="200" Margin="0,20,0,0" /> 
    </StackPanel> 
</UserControl> 

page. xaml.cs:

using System.ComponentModel; 
using System.Windows; 
using System.Windows.Controls; 
using SilverlightApplication1.ServiceReference1; 

namespace SilverlightApplication1 
{ 
    public partial class Page : UserControl 
    { 
     public bool IsWorking 
     { 
      get { return ProgressBarWorking.IsIndeterminate; } 
      set { ProgressBarWorking.IsIndeterminate = value; } 
     } 

     public Page() 
     { 
      InitializeComponent(); 
     } 

     private void ButtonDoWork_Click(object sender, RoutedEventArgs e) 
     { 
      Service1Client client = new Service1Client(); 
      client.DoWorkCompleted += OnClientDoWorkCompleted; 
      client.DoWorkAsync(); 

      this.IsWorking = true; 
     } 

     private void OnClientDoWorkCompleted(object sender, AsyncCompletedEventArgs e) 
     { 
      this.IsWorking = false; 
     } 
    } 
} 

Réglage IsIndeterminate true après l'appel asynchrone à DoWork rend la barre de progression pour une période indéterminée comme celui-ci anime:

alt text http://www.freeimagehosting.net/uploads/89620987f0.png

Parce que le rappel à OnClientDoWorkCompleted arrive sur le fil interface utilisateur, il est bien de changer la valeur de la propriété IsIndeterminate retour false dans le corps de la méthode; cela entraîne une nouvelle fois un objet ProgressBar vierge d'animation lorsque le travail/l'attente est terminé.

est sous le code pour le service Web et la méthode DoWork que le code ci-dessus appelle de manière asynchrone, tout ce qu'il fait, il simulent une tâche en cours d'exécution longue en dormant pendant 5 secondes:

using System; 
using System.ServiceModel; 
using System.ServiceModel.Activation; 
using System.Threading; 

namespace SilverlightApplication1.Web 
{ 
    [ServiceContract(Namespace = "")] 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    public class Service1 
    { 
     [OperationContract] 
     public void DoWork() 
     { 
      Thread.Sleep(TimeSpan.FromSeconds(5.0)); 
      return; 
     } 
    } 
} 
+0

Merci, je vais certainement essayer cela. J'ai jusqu'à ce que je devrais ajouter une sorte de synchronisation (verrouillage) autour de la variable IsWorking et en faire un int. C'est parce qu'il y aura des demandes asynchrones faites en parallèle, et l'animation devrait continuer jusqu'à ce que tous les appels soient terminés. –

+0

J'utilise simplement l'indicateur de présence qui fonctionne parfaitement –