Archivio per la Categoria 'c'

Invoke

Prima o poi vi capiterà di sviluppare una applicazione che faccia uso dei Threads per svolgere operazioni in background.
Magari se non avete mai utilizzato i Threads, vi consiglio questo articolo (in inglese) An Introduction to Programming with C# Threads

Il problema dell’Invoke si presenta nel momento in cui cercate di aggiornare la UI di una Form da un thread. Infatti .NET consente l’invocazione delle funzioni dell’oggetto System.Windows.Forms.Control solo dal thread in cui l’oggetto è stato creato. Per aggirare l’ostacolo abbiamo bisogno di utilizzare le funzioni Control.Invoke (chiamata sincrona) or Control.BeginInvoke (chiamata asincrona). Normalmente, il nostro approccio sarebbe quello di scrivere tante delegates per quanti sono gli oggetti da invocare o metodi da aggiornare:
delegate void AggiungiListboxDelegate(string msg);
[...]
if (this.InvokeRequired) {
Invoke(new AggiungiListboxDelegate(AggiungiAListBox), new object[] { itm } );
}
else
{
AggiungiAListBox(itm);
}

Esiste invece un metodo più semplice ed utilizzabile in modo generico nella maggior parte dei casi. Scriviamo delle delegates generiche che ricevono:

  • o l’oggetto, il nome della property da valorizzare e il nuovo valore da assegnare
  • o l’oggetto, il nome del metodo da invocare e i parametri da passare al metodo

delegate void SetPropertyDelegate(object ctl, string objName, object newValue);
delegate void SetMethodDelegate(object obj, string methodName, object[] parameters);
[...]

void SetProperty(object ctl, string propName, object newValue) {
Type t = ctl.GetType();
PropertyInfo pi = t.GetProperty(propName);

if (pi != null) {
pi.SetValue(ctl,newValue,null);
}
}
void SetMethod(object ctl, string methodName, object[] parameters) {
Type t = ctl.GetType();
MethodInfo mi = t.GetMethod(methodName);

if (mi != null) {
mi.Invoke(ctl, parameters);
}
}
Un esempio di utilizzo:

Invoke(new SetPropertyDelegate(SetProperty), new object[] { (object)lblErrMessage, "Text", errmsg });

oppure

Invoke(new SetMethodDelegate(SetMethod), new object[] { (object)this, "Close", (new object[] {}) } );

A voi l’onere di migliorare l’idea :)

[Slashdot] [Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

Tag: Sistemi di Call Center | Centralino Voip | Consulente Asterisk Napoli | Centralino Telefonico | Voip | Asterisk CTI | PBX | Telefoni IP | Networking | Linux


Sviluppo di IVR, sistemi di callcenter, PBX Voip.