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;
}
}
}
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. –