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