2017-01-26 3 views
4

Winforms, C#, VS2010.control.invoke avec un paramètre de sortie

J'ai un fil d'interrogation qui fonctionne pendant la durée de vie de mon application. De temps en temps, il appelle un événement sur mon formulaire principal. Je n'ai pas touché le code depuis des années et il fonctionne avec succès mais maintenant j'ai besoin d'ajouter un paramètre "out" à la liste des paramètres. J'ai cherché en ligne mais tous les fils que j'ai trouvés ont été en réflexion et ont été complexes pour tenter de se convertir à mon contexte. Le mien n'utilise pas de réflexion.

Quelqu'un peut-il aider à résoudre ce problème? Sur les fils de réflexion que je lis, les gens semblent vérifier un tableau d'objets pour le résultat du paramètre out, que je n'utilise pas dans mon code, et je ne saurais pas où l'obtenir de toute façon.

private bool OnNeedUpdateCreateEvent(string title, string message, 
    bool creatingNew, out string newPlanName) 
{ 
    newPlanName = ""; 

    // 1st pass through this function. 
    // Check to see if this is being called from another thread rather 
    // than the main thread. If so then invoke is required 
    if (InvokeRequired) 
    { 
     // Invoke and recall this method. 
     return (bool)Invoke(new onNeedToUpdatePlanEvent(OnNeedUpdateCreateEvent), 
     title, message, creatingNew, out newPlanName); <- wrong out param 

    } 
    else 
    { 
     // 2nd pass through this function due to invoke, or invoke not required 
     return InputDlg(this, title, message, creatingNew, out newPlanName); 
    } 

} 

Répondre

4

C'est comme vous le savez déjà, vous n'avez pas encore trouvé la matrice. Il est automatiquement créé par le compilateur. La signature du Invoke method est:

public object Invoke(
    Delegate method, 
    params object[] args 
) 

Il est le mot-clé params qui obtient le compilateur pour créer automatiquement le tableau. Bonne syntaxe de sucre, mais ça ne vous aide pas ici. Vous avez juste à le faire vous-même, comme ceci:

if (!creatingNew) { 
    // Invoke and recall this method. 
    object[] args = new object[] { title, message, creatingNew, null }; 
    var retval = (bool)Invoke(new onNeedToUpdatePlanEvent(OnNeedUpdateCreateEvent), args); 
    newPlanName = (string)args[3]; 
    return retval; 
} 
// etc..