2009-11-02 8 views
0
class SimpleDelegate 
{ 
    public delegate void LogHandler(string message); 

    public void Process(LogHandler logHandler) 
    { 
    if (logHandler != null) 
    { 
     Console.WriteLine("Process begin"); 
    } 

    if (logHandler != null) 
    { 
     Console.WriteLine("Process end"); 
    } 
    } 
} 

class FileLogger 
{ 
    FileStream fileStream; 
    StreamWriter writer; 

    public FileLogger(string fileName) 
    { 
    fileStream = new FileStream(fileName, FileMode.Create); 
    writer = new StreamWriter(fileStream); 
    } 

    public void Logger(string s) 
    { 
    writer.WriteLine(s); 
    } 

    public void Close() 
    { 
    writer.Close(); 
    fileStream.Close(); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
    SimpleDelegate cp = new SimpleDelegate(); 

    FileLogger fl = new FileLogger(@"C:\TEMP\MyLog.log"); 

    SimpleDelegate.LogHandler handler = null; 
    handler += new SimpleDelegate.LogHandler(Logger); 
    handler += new SimpleDelegate.LogHandler(fl.Logger); 

    cp.Process(handler); 

    fl.Close(); 
    } 

    static void Logger(string s) 
    { 
    Console.WriteLine("writing s " + s); 
    } 
} 

sur l'exécution I get suivantes sortie:
processus commence
fin du processus
Appuyez sur une touche pour continuer. . .
délégué simple ne fonctionne pas

En fait, il devrait être:
processus commence
fin processus
processus commence
fin du processus
Appuyez sur une touche pour continuer. . .

Je ne suis pas en mesure de comprendre l'erreur :(

Répondre

4

vous n'appeler SimpleDelegate.Processune fois - pourquoi voudriez-vous attendre à voir la sortie deux fois

Vous n'êtes jamais en train d'appeler le délégué ... juste en le testant pour la nullité. Vous testez deux fois, une fois avant d'écrire "Début du processus" et une fois avant d'écrire "Fin du processus", mais c'est tout.

+0

merci. J'ai compris. :) – Saar

+0

Merci encore. Maintenant, j'appelle Invoke (chaîne s) à l'intérieur de cp.Process, et la sortie est comme prévu comme ligne à la console et même ligne dans le fichier MyLog.log aussi. :) – Saar

0

Je pense que c'est ce qui se passe

SimpleDelegate cp = new SimpleDelegate(); 

    FileLogger fl = new FileLogger(@"C:\TEMP\MyLog.log"); 

    cp.Process(null); 
    fl.Close(); 

C'est handler est nulle, de sorte que le code ne sera exécuté. Vous voyez votre message une fois en raison de l'appel à cp.Process(null)

+0

merci de répondre. – Saar

4

Je ne sais pas si je reçois le point ...

Mais vous ne l'appelle LogHandler dans ce code:

public void Process(LogHandler logHandler) 
    { 
     if (logHandler != null) 
     { 
      Console.WriteLine("Process begin"); 
     } 

     if (logHandler != null) 
     { 
      Console.WriteLine("Process end"); 
     } 
    } 
+0

+1: Bien repéré :) – leppie

1

Je crois que votre confusion est autour du fait que vous appelé "LogHandler + = ..." deux fois, mais n'obtiennent que deux sorties. Notez que la fonction Process que vous appelez ne fait pas de boucle qui utilise LogHandler! C'est pourquoi vous n'obtenez pas les résultats que vous attendez.

En outre, le modèle que vous utilisez est légèrement désactivé. Au lieu d'utiliser directement le délégué, il est préférable de créer un événement et de vous y abonner.

public delegate void LogHandler(string message); 
public event LogHandler OnLog; 
... 
OnLog += ... 
+0

merci pour l'indice. Je vais essayer avec l'événement. – Saar

Questions connexes