2010-10-27 5 views
0

J'ai un winapp exécuté avec une DLL qui y est référencée. toutes les opérations majeures sont effectuées dans la DLL.Mise à jour asynchrone de l'interface utilisateur lorsqu'une exception se produit dans la DLL référencée

J'ai comme 1000 fichiers xml stockés dans un emplacement que je dois lire et stocker des données dans un autre format. De l'interface utilisateur, je clique sur un bouton d'importation, l'appel est passé à la couche DLL qui convertit un xml après l'autre stocké à l'emplacement dans une boucle foreach.

Si un fichier XML échoue parce qu'il n'est pas au format approprié, l'outil doit afficher un message dans une zone de texte de mon interface utilisateur, mais l'exception se produit dans la DLL. L'outil doit continuer avec les autres XML. Je connais par un délégué son possible, mais je suis confus sur la façon de l'utiliser entre la DLL et l'interface utilisateur que la DLL n'a pas le handle de zone de texte.

grâce ...

Répondre

1

Vous devez utiliser des événements - la classe concernée dans la DLL peut définir événement pour signaler le succès/échec de chaque fichier xml que l'interface utilisateur peut gérer. Une autre façon serait d'accepter la fonction de rappel (délégué) dans la méthode pour informer l'interface utilisateur. Here'e le code simple exemple:

Dans DLL:

// delegate that will inform UI 
public delegate void FileProcessedHandler(string filePath, bool success); 

... 

// Method that process files 
public void Process(FileProcessedHandler callback) 
{ 

    // loop processing file one by one 
    for(..) 
    { 
     // process one file 
     var success = processFile(filePath); 

     // Notify UI 
     if (null != callback) 
     { 
     callback(filePath, success); 
     } 
    } 
} 

dans l'interface utilisateur:

... 
// code that invokes DLL for processing file 
// must invoked on the different thread so that UI will remain responsive 
ThreadPool.QueueUserWorkItem(o => { [object from DLL].Process(OnFileProcessed); }); 

.... 

// Callback method (assuming inside control/form) 
public void OnFileProcessed(string filePath, bool success) 
{ 
    // Its important to marshal call to UI thread for updating UI 
    this.Invoke(() => { 
     Text1.Text = string.Format("File: {0}, Processed: {1}", filePath, success? "Success": "Failure"); 
    }); 
} 
+0

Hey merci, cela a fonctionné comme un jeu d'enfant, un seul changement this.Invoke ((MethodInvoker) déléguer ... :-) – srivatsayb

Questions connexes