2016-07-20 3 views
0

Dans mon application Silverlight, j'ai placé l'appel WCF dans ma classe ViewModel.wcf L'appel terminé n'est pas déclenché dans l'ordre correct

DateTime CurrentDateTime; 
internal void GetDateTime() 
{ 
    var client = new WcfClient(); 
    client.GetCurrentDateTimeCompleted += GetCurrentDateTimeCompleted; 
    client.GetCurrentDateTimeAsync(); 
} 

private void GetCurrentDateTimeCompleted(object sender, GetCurrentDateTimeCompletedEventArgs args) 
{ 
    try 
    { 
      CurrentDateTime = args.Result; 
    } 

Puis dans mon code derrière le fichier de code. J'ai un événement cliqué de case à cocher.

private void CheckBox_Clicked(object sender, RoutedEventArgs e) 
    { 
     var msgBoxControl = new MessageBoxControl(); 
       msgBoxControl.Closed -= MessageBoxYesNo_Closed; 
       msgBoxControl.Closed += MessageBoxYesNo_Closed; 

Dans la méthode MessageBoxYesNo_Closed, j'appelle la méthode dans la classe ViewModel.

private void MessageBoxYesNo_Closed(object sender, EventArgs e) 
{ 
    try 
    { 
     this.ViewModel.GetDateTime(); 
     curDateTime = this.ViewModel.CurrentDateTime; 

Ma question est que parfois la ligne curDateTime = this.ViewModel.CurrentDateTime; est exécutée avant que la méthode terminée appel WCF, donc je ne peux pas obtenir la bonne valeur.

Je suppose qu'il peut y avoir deux threads, l'un est dans l'interface utilisateur, l'autre est en appel de service? S'il vous plaît ne pas utiliser async/Attendent que je dois utiliser Visual Studio 2010.

Merci

+1

Le problème ici (je pense) est que la méthode 'GetCurrentDateTimeAsync' est Asynchrone, ce qui signifie que dans votre gestionnaire' MessageBoxYesNo_Closed' la méthode 'GetDateTime' retournera avant qu'elle ne soit terminée. Je n'ai aucune expérience avec silverlight mais je suggérerais d'utiliser async/await s'il est supporté. – Phaeze

+0

En effet, vous exécutez un appel asynchrone pour obtenir l'heure, puis demandez immédiatement la valeur au contrôle. Mais la requête asynchrone peut être terminée plus tard. Ainsi, vous pouvez demander des données de manière synchrone ** GetCurrentDateTime **, puis définir la valeur dans ViewModel, mais il peut geler votre thread d'interface utilisateur si la demande prend trop de temps. Ou utilisez async/await pour définir * curDateTime * lorsque la requête asynchrone est terminée. Mais alors il peut être déroutant pour l'utilisateur s'il veut voir l'heure juste après que la boîte de dialogue soit fermée. Ou vous pouvez utiliser un indicateur d'attente ... –

+0

J'utilise Visual Studio 2010. Donc async/await n'est pas supporté. – Bigeyes

Répondre

0

Obtenez la solution, il suffit d'ajouter une boucle while:

  this.ViewModel.GetDateTime(); 

      while (true) 
      { 
       this.ViewModel.CurrentDateTime = DateTime.Now; 
       if (this.ViewModel.CurrentDateTime != DateTime.MinValue) 
        break; 
      } 
      curDateTime = this.ViewModel.CurrentDateTime;