2010-04-13 5 views
0

J'ai 2 classes A et B, où ils appartiennent au même espace de noms, mais réside dans des fichiers séparés à savoir les a.cs et b.cs, où la classe B est essentiellement une aide enroulant un appel de service Web comme suit:Comment utiliser délégué pour effectuer un rappel entre l'appelant et la classe d'assistance du service Web?

public class A 
{ 
    public A() // constructor 
    { 
     protected static B b = new B(); 
    } 

    private void processResult1(string result) 
    { 
     // come here when result is successful 
    } 

    private void processResult2(string result) 
    { 
     // come here when result is failed 
    } 
    static void main() 
    { 
     b.DoJobHelper(...); 
    } 
} 

public class B 
{ 
    private com.nowhere.somewebservice ws; 
    public B() 
    { 
     this.ws = new com.nowhere.somewebservice(); 
     ws.JobCompleted += new JobCompletedEventHandler(OnCompleted); 
    } 
    void OnCompleted(object sender, JobCompletedEventArgs e) 
    { 
     string s = e.Result; 
     Guid taskID = (Guid)e.UserState; 
     switch (s) 
     { 
      case "Success": 
      // Call processResult1(); 
      break; 
      case "Failed": 
      // Call processResult2(); 
      break; 
      default: break; 
     } 
    } 
    public void DoJobHelper() 
    { 
     Object userState = Guid.NewGuid(); 
     ws.DoJob(..., userState); 
    }   
} 

(1) J'ai vu des textes sur le net sur l'utilisation des délégués pour les rappels, mais je n'ai pas appliqué cela à mon cas. Tout ce que je veux faire est d'appeler la méthode processResult() appropriée lors de l'événement OnCompleted(), mais dunno comment et où déclarer le délégué:

public delegate void CallBack(string s); 

(2) Il y a un objet émetteur passé pour OnCompleted() mais jamais utilisé, ai-je manqué quelque chose là-bas? Ou comment puis-je faire bon usage de sender?

Toute aide appréciée.

+0

Puisqu'il semble que votre question a été répondue, pourquoi ne pas la marquer comme réponse? – Noctis

Répondre

0

1)

public class A 
{ 
    public A() // constructor 
    { 
     protected static B b = new B(processResult1, processResult2); 
    } 

    private void processResult1(string result) 
    { 
     // come here when result is successful 
    } 

    private void processResult2(string result) 
    { 
     // come here when result is failed 
    } 
    static void main() 
    { 
     b.DoJobHelper(...); 
    } 
} 

public class B 
{ 
    private com.nowhere.somewebservice ws; 
    private Action<string> success; 
    private Action<string> failure; 
    public B(Action<string> success, Action<string> failure) 
    { 
     this.success = success; 
     this.failure = failure; 
     this.ws = new com.nowhere.somewebservice(); 
     ws.JobCompleted += new JobCompletedEventHandler(OnCompleted); 
    } 
    void OnCompleted(object sender, JobCompletedEventArgs e) 
    { 
     string s; 
     Guid taskID = (Guid)e.UserState; 
     //this switch will never do anything because s is null right now. 
     //you'll need to check some actual state, or translate some other 
     //state into the "Success" and "Failure" words for the s variable 
     //before you call this switch statement. 
     switch (s) 
     { 
      case "Success": 
      {  
       success(s); 
       break; 
      } 
      case "Failed": 
      { 
       failure(s); 
       break; 
      } 
      default: break; 
     } 
    } 
    public void DoJobHelper() 
    { 
     Object userState = Guid.NewGuid(); 
     ws.DoJob(..., userState); 
    }   
} 

2) ne prennent pas la peine utilisant l'expéditeur. Ce n'est important que si vous avez plusieurs événements d'objets gérés par la même méthode de gestionnaire d'événements.

+0

Merci Derick. Ça va marcher, mais je veux essayer le délégué en C# ... hehe :-) – Chris

+0

je ne comprends pas le commentaire ... c'est valide C# ... j'écris C# comme ça toute la journée, tous les jours jour –

+0

Le commentaire ci-dessus était moi me demandant s'il y a un moyen d'appliquer la construction "délégué" pour résoudre le problème de programmation, la seule raison étant d'apprendre une nouvelle chose plutôt que toute autre chose. Je vais utiliser votre approche car elle fonctionne et fait le travail. Merci et ne vous offensez pas, Derick. – Chris

Questions connexes