Dell'importanza del metodo Control.Invoke non mi sembra il caso di discuterne
nemmeno; è stato sorprendente per me però scoprire che di base non è possibile
passare argomenti ad un metodo tramite invoke nel compact framework, visto e
considerato che nell'ambiente di sviluppo per palmari
l'overload public virtual object Invoke(Delegate, object[]); non è supportato!
Ecco quindi una classe, leggermente maneggiata (ma nemmeno tanto)
rispetto a quella disponibile qui, per superare la limitazione:
using System;
using System.Collections;
using System.Windows.Forms;
namespace TerraNova.OnSite
{
public delegate void MethodCallInvoker (object[] o);
public class ControlInvoker
{
private class MethodCall
{
public MethodCallInvoker invoker;
public object[] arguments;
public MethodCall (MethodCallInvoker invoker, object[] arguments)
{
this.invoker = invoker;
this.arguments = arguments;
}
}
private Control control;
private Queue argumentInvokeList = new Queue();
public ControlInvoker(Control control)
{
this.control = control;
}
public void Invoke(MethodCallInvoker invoker, params object[] arguments)
{
this.argumentInvokeList.Enqueue(new MethodCall(invoker, arguments));
control.Invoke(new EventHandler(ControlInvoke));
}
private void ControlInvoke (object sender, EventArgs e)
{
MethodCall methodCall = (MethodCall)argumentInvokeList.Dequeue();
methodCall.invoker(methodCall.arguments);
}
}
}
powered by IMHO 1.3