Da quello che ho trovato in C#, il metodo Control.Invoke richiede l'utilizzo di un delegato senza parametri di input. C'è un modo per aggirare questo? Vorrei invocare un metodo per aggiornare l'interfaccia utente da un altro thread e passare a esso i parametri di stringa.Control.Invoca con input Parametri
risposta
Quale versione di C# stai utilizzando? Se si utilizza C# 3.5, è possibile utilizzare le chiusure per evitare di passare i parametri.
Con 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());
}
}
sicura invocando il codice ora diventa banale.
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());
Con C# 2.0 diventa meno banale
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;
}
}
}
Utilizzando semplice, ma è necessario definire più callback per più parametri.
this.UpdateControlText(label1, "Hello world");
credo (eccellente) l'approccio di Samuel può essere spinto ancora di più:
Metodo di estensione: il codice
public static void ExecuteAsync<TControl>(this TControl control, Action action)
where TControl : Control
{
new Thread(() =>
{
control.Invoke(action);
})
.Start();
}
Forma:
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.
});
}
Come Luca dice, usa Control.I nvoke simili ...
Ad esempio in una forma:
public delegate void DelegatePassMessages(string name, int value);
public DelegatePassMessages passMessage;
Nella contructor:
passMessage = new DelegatePassMessages (this.MessagesIn);
Poi la funzione MessagesIn ricevere dati:
public void MessagesIn(string name, int value)
{
}
Poi per passare i dati al modulo:
formName.Invoke(formName.passMessage, new Object[] { param1, param2});
Trovato un metodo elegante per .net 2.0 con metodi anonimi racchiusi in un delegato MethodInvoker. In questo modo non è necessario definire i propri delegati tutto il tempo.Esempio:
private void InitUI(Guid id, string typename)
{
MethodInvoker inv = delegate{tvMatrix.Nodes[0].Nodes.Add(id.ToString(), typename);};
tvMatrix.Invoke(inv);
}
Perché non
tvMatrix.Invoke((MethodInvoker) (() => {
tvMatrix.Nodes[0].Nodes.Add(id.ToString(), typename);
}));
Alcuni più possibilità:
this.Invoke(new MethodInvoker(() => this.DoSomething(param1, param2)));
o
this.Invoke(new Action(() => this.DoSomething(param1, param2)));
o anche
this.Invoke(new Func<YourType>(() => this.DoSomething(param1, param2)));
dove la prima opzione è la migliore, perché MethodInvoker è concepito per questo scopo e offre prestazioni migliori.
Qui si usa le espressioni lambda con l'estensione Invoke() + un parametro di input.
Usando: l'azione (STARS db)
_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. Filtri Kalman con quattro parametri di input
- 2. Come creare un servizio Web Restful con parametri di input?
- 3. Funzioni anonime senza parametri di input
- 4. Parametri nominati con parametri
- 5. symfony reindirizza con 2 parametri
- 6. Asp.Net Mvc I parametri di input JQuery ajax sono nulli
- 7. Metodi con parametri Java
- 8. Come gestire i parametri di input nulli in Scala
- 9. Parametri di input angolare 2 sulla direttiva root
- 10. I parametri di input distruttivi sono disponibili in Scala?
- 11. Input reindirizzamento con python
- 12. input dell'utente con node.js
- 13. Torcia, come eseguire uno script con "dofile" e parametri di input?
- 14. Come passare i parametri @Input() a un componente angolare 2 creato con DynamicComponentLoader
- 15. Sottoclasse sottoclasse con parametri dinamici
- 16. PHP isset() con più parametri
- 17. thread con più parametri
- 18. Android: I18n con parametri
- 19. call_user_func con parametri dinamici
- 20. Activator.CreateInstance con parametri facoltativi
- 21. Esegui con parametri
- 22. Controller Web2py con parametri?
- 23. LIMITE MySQL con parametri
- 24. performSelectorOnMainThread con parametri multipli
- 25. Panda read_sql con parametri
- 26. baffi i18n con parametri
- 27. Moq ReturnsAsync() con parametri
- 28. Singleton con parametri
- 29. UIGraphicsBeginImageContext con parametri
- 30. Parametri extra con socket.io