2011-09-22 1 views
4

Au premier examen, il semble que c'est le cas. Un examen rapide de la pile d'appels montre que la méthode transmise au délégué est exécutée comme on pourrait s'y attendre. En appelant le délégué dans un "événement de clic" et en essayant de modifier des contrôles (par exemple visibilité, liaison, mise à jour des panneaux de mise à jour) rien ne se passe (en fait pour un appel explicite à UpdatePanel.Update une exception). est jeté en disant que la méthode ne peut pas être appelée après Render - à toutes fins utiles, Im perceptible PAS à ce stade dans le cycle de vie de la page, mais plutôt dans un événement de contrôle - invariablement géré comme un événement de publication, toujours avant Render, mes meilleures connaissances.). Cependant ... Lorsque je retourne au site d'appel et que j'exécute le même code (juste après l'appel de délégué) que j'ai essayé d'exécuter (à partir de la méthode appelée par le délégué) pour modifier les commandes, .L'appel d'un délégué défini avec une signature (par exemple) Func <t,t> est-il exécuté de manière synchrone dans ASP.NET?

Que pourrait-il se passer?

EDIT Code-cadre:

IModalWorkflowItem 
{ 
    void ExecuteWorkflow(); 
    ..... 
} 

public abstract class BaseModalWorkflow : IModalWorkflowItem 
{ 
    .... 
    protected Func<String, IMinervaValidator , Boolean>_action; 
    .... 

    /// <summary> 
    /// Using the properties (if necessary) perform the action 
    /// required on completion of modal workflow 
    /// </summary> 
    /// <returns></returns>; 
    protected abstract Boolean PerformAction(PropertyBag properties); 
    } 

Création d'objet qui passe dans la méthode lambda comme anonyme ...

new ModalWorkflowUserGroupAction(ModalPopupExtender_UserPrompt, 
        Session, 
        (x, y) => 
        { 
         if (UserGroupManager.UserAccessToUserGroup(membershipID, 
          CurrentUserGroup.UserGroupID, false)) 
         { 
          BindUserList(); 

appel réel:

/// <summary> 
/// Call the next action in the modal workflow. 
/// </summary> 
/// <param name="sender"></param> 
/// <param name="e"></param> 
protected void ExpandingButton_ModalConfirmContinue_Click 
           (Object sender, EventArgs e) 
{ 
    if (CurrentModalWorkFlowItem != null) 
    { 
     CurrentModalWorkFlowItem.ExecuteWorkflow(); 
+2

Pouvez-vous montrer le code comment vous appelez le délégué? – Jan

+0

Pouvez-vous montrer un exemple de code plus complet? Où est implémenté 'ExecuteWorkflow'? Où est défini 'ModalWorkflowUserGroupAction'? Où le délégué est-il réellement appelé? – Jan

+0

Aussi, pourriez-vous réduire cela? Existe-t-il un exemple plus simple qui reproduit le problème? Et pouvez-vous être plus clair sur ce qui vous a fait penser que l'appel pourrait être asynchrone? Cela semble être un malentendu sur le cycle de vie de la page. Je vous recommande d'activer le suivi de page ASP.NET et d'utiliser 'Trace' pour voir exactement où le code s'exécute dans le cycle de vie. –

Répondre

2

Oui, appeler un délégué se produit de manière synchrone, dans n'importe quel type de programme .NET. Ce genre de chose ne change pas soudainement simplement parce que vous utilisez ASP.NET.

+0

Je suis d'accord que cela ne devrait pas arriver. Cependant, l'exécution de la méthode pointée par le délégué semble se produire en dehors des domaines normaux du cycle de vie de la page. C'est à dire. Au moment de l'exécution, quelque chose de "drôle" se produit ... Pourquoi un appel à une méthode UpdatePanel.Update provoque-t-il l'apparition d'une exception disant que j'essaye de le faire après Render - quand je fais l'appel dans un post retour d'événement. C'est ce qui me cause la confusion et qui me fait croire que quelque chose ne va pas ... – brumScouse

+1

Encore un peu de travail pour que la réponse soit utile -1 – brumScouse

+0

De quoi d'autre avez-vous besoin? L'appel des délégués est toujours synchrone. Le fait que vous l'appeliez depuis ASP.NET ne change pas le comportement de .NET pour qu'il devienne soudainement synchrone en asynchrone. .NET ne se comporte pas différemment d'un type de programme à un autre. Déjà. –

Questions connexes