2009-11-11 5 views
0

J'ai une question concernant le séquençage des événements dans le scénario où vous appelez un service wcf de Silverlight 3 et la mise à jour de l'interface utilisateur sur un thread séparé. Fondamentalement, je voudrais savoir si ce que je fais est correct ... L'échantillon est comme suit. Ceci est mon premier post sur ici, alors portez-moi, parce que je ne suis pas sûr de savoir comment publier le code réel. L'échantillon est comme suit:Appel de service Web Async de Silverlight 3

//<summary> 
public static void Load(string userId) 
{ 

    //Build the request. 
    GetUserNameRequest request = 
    new GetUserNameRequest { UserId = userId }; 

    //Open the connection. 
    instance.serviceClient = ServiceController.UserService; 

    //Make the request. 
    instance.serviceClient.GetUserNameCompleted 
    += UserService_GetUserNameCompleted; 

    instance.serviceClient.GetGetUserNameAsync(request); 

    return instance.VM; 
} 

/// <summary> 
private static void UserService_GetUserNameCompleted(object sender, GetUserNameCompletedEventArgs e) 
{ 
    try 
    { 
    Controller.UIDispatcher.BeginInvoke(() => 
    { 
     //Load the response. 
     if (e.Result != null && e.Result.Success) 
     { 
     LoadResponse(e.Result); 
     } 

     //Completed loading data. 
    }); 
    } 
    finally 
    { 
    instance.serviceClient.GetUserNameCompleted 
     -= UserService_GetUserNameCompleted; 

    ServiceHelper.CloseService(instance.serviceClient); 
    } 
} 

Ma question est donc essentiellement, à l'intérieur de mon thread d'interface utilisateur quand je suis le chargement de la réponse, si elle déclenche une exception, sera la prise de bloc « enfin » que? Si non, devrais-je mettre un autre essai/attraper à l'intérieur du lambda où je charge la réponse?

En outre, puisque j'exécute la charge sur le thread d'ui, est-il possible que le finalement s'exécutera avant que le thread d'interface utilisateur ait fini de mettre à jour? Et pourrait par conséquent appeler le Servicehelper.CloseService() avant que le chargement ait été fait?

Je demande parce que j'ai des problèmes intermittents en utilisant cette approche.

Répondre

0

Le bloc finally doit être exécuté avant le traitement de la réponse dans BeginInvoke. BeginInvoke signifie que le code sera exécuté dans le cycle d'interface utilisateur suivant.

Typiquement, la meilleure approche pour ce type de choses est de tirer toutes les données dont vous avez besoin hors de la réponse et de les stocker dans une variable, puis de nettoyer votre code de service. Puis appelez BeginInvoke et mettez à jour l'interface utilisateur à l'aide des données de la variable.

Questions connexes