D'après ce que j'ai trouvé dans C#, la méthode Control.Invoke nécessite que vous utilisiez un délégué sans paramètres d'entrée. Y at-il un moyen de contourner cela? Je voudrais appeler une méthode pour mettre à jour l'interface utilisateur d'un autre thread et lui passer des paramètres de chaîne.Control.Invoke avec entrée Paramètres
Répondre
Quelle version de C# utilisez-vous? Si vous utilisez C# 3.5, vous pouvez utiliser des fermetures pour éviter de passer des paramètres.
Avec C# 3,5public static class ControlExtensions
{
public static TResult InvokeEx<TControl, TResult>(this TControl control,
Func<TControl, TResult> func)
where TControl : Control
{
return control.InvokeRequired
? (TResult)control.Invoke(func, control)
: func(control);
}
public static void InvokeEx<TControl>(this TControl control,
Action<TControl> func)
where TControl : Control
{
control.InvokeEx(c => { func(c); return c; });
}
public static void InvokeEx<TControl>(this TControl control, Action action)
where TControl : Control
{
control.InvokeEx(c => action());
}
}
en toute sécurité le code appelant devient trivial.
this.InvokeEx(f => f.label1.Text = "Hello World");
this.InvokeEx(f => this.label1.Text = GetLabelText("HELLO_WORLD", var1));
this.InvokeEx(() => this.label1.Text = DateTime.Now.ToString());
Avec C# 2.0, il devient moins trivial
public class MyForm : Form
{
private delegate void UpdateControlTextCallback(Control control, string text);
public void UpdateControlText(Control control, string text)
{
if (control.InvokeRequired)
{
control.Invoke(new UpdateControlTextCallback(UpdateControlText), control, text);
}
else
{
control.Text = text;
}
}
}
Son utilisation simple, mais vous devez définir plus callbacks pour plus de paramètres.
this.UpdateControlText(label1, "Hello world");
Je pense que l'approche de Samuel (excellent) peut être poussé encore plus:
Méthode d'extension:
public static void ExecuteAsync<TControl>(this TControl control, Action action)
where TControl : Control
{
new Thread(() =>
{
control.Invoke(action);
})
.Start();
}
Code Forme:
private void doStuff()
{
this.ExecuteAsync(() =>
{
// Do your stuff in a separate thread
// but having full access to local or instance variables.
// No (visible) threading code needs to be used here.
});
}
Comme Luc dit, utilisez Control.I nvoke comme ça ...
Par exemple, dans une forme:
public delegate void DelegatePassMessages(string name, int value);
public DelegatePassMessages passMessage;
Dans le contructor:
passMessage = new DelegatePassMessages (this.MessagesIn);
Ensuite, la fonction MessagesIn pour recevoir des données:
public void MessagesIn(string name, int value)
{
}
Ensuite, pour transmettre des données à votre formulaire:
formName.Invoke(formName.passMessage, new Object[] { param1, param2});
J'ai trouvé une méthode élégante pour .net 2.0 avec des méthodes anonymes enveloppées dans un délégué MethodInvoker. De cette façon n'est pas nécessaire de définir ses propres délégués tout le temps.Exemple:
private void InitUI(Guid id, string typename)
{
MethodInvoker inv = delegate{tvMatrix.Nodes[0].Nodes.Add(id.ToString(), typename);};
tvMatrix.Invoke(inv);
}
Pourquoi ne pas
tvMatrix.Invoke((MethodInvoker) (() => {
tvMatrix.Nodes[0].Nodes.Add(id.ToString(), typename);
}));
Quelques autres possibilités:
this.Invoke(new MethodInvoker(() => this.DoSomething(param1, param2)));
ou
this.Invoke(new Action(() => this.DoSomething(param1, param2)));
ou même
this.Invoke(new Func<YourType>(() => this.DoSomething(param1, param2)));
où la première option est la meilleure, parce que MethodInvoker est conçu à cette fin et a de meilleures performances.
Ici, vous allez utiliser des expressions lambda avec l'extension Invoke() + un paramètre d'entrée.
Utiliser: Action (db STARS)
_ccb.GetImagerFRU_PartNbr().Invoke(new Action<STARS>(dbase => _ccb.GetImagerFRU_PartNbr().Text = dbase.PartNumber(serial) ?? String.Empty), db);
private void ppTrace(string tv)
{
if (_Txb1.InvokeRequired)
{
_Txb1.Invoke((Action<string>)ppTrace, tv);
}
else
{
_Txb1.AppendText(tv + Environment.NewLine);
}
}
- 1. C# Entrée de réception console avec pipe
- 2. Quel est l'équivalent de WinForms Control.Invoke dans WPF?
- 3. J'ai besoin de définir plus d'une seule propriété pendant Control.Invoke
- 4. calculer l'heure entrée par l'utilisateur avec Python
- 5. entrée/sortie avec Java Web Start
- 6. log4j avec horodatage par entrée de journal
- 7. Ajouter une propriété onclick entrée avec JavaScript
- 8. Paramètres d'itinérance avec LocalFileSettingsProvider
- 9. Gestionnaire d'événements avec paramètres
- 10. Traitement FOP avec paramètres
- 11. Java Webstart avec paramètres
- 12. thread avec plusieurs paramètres
- 13. Interrupteur avec trois paramètres?
- 14. problème de paramètres avec Expression.Lambda()
- 15. htaccess mod_rewrite avec paramètres dynamiques
- 16. Rails: overwrite_params avec paramètres imbriqués
- 17. symfony rediriger avec 2 paramètres
- 18. Crystal Reports avec les paramètres
- 19. ASP.NET ODBC requête avec paramètres
- 20. fonctions en tant que paramètres (avec paramètres) - JavaScript
- 21. lecture entrée midi
- 22. Entrée standard PHP?
- 23. Entrée clavier en PHP
- 24. texte entrée multi-ligne
- 25. Envoi de formulaires HTML avec Slider en entrée (WebFX)
- 26. Forme Sumbit avec la touche Entrée et recherche du curseur
- 27. Problème avec entrée et points d'ancrage entre les navigateurs
- 28. Comment naviguer entre les champs avec la touche Entrée
- 29. Pixel shader WPF avec entrée HDR (16 bits)?
- 30. Comment obtenir une entrée de l'utilisateur avec NASM?