2009-08-04 7 views
1

Je receving un ArgumentException du code suivant, je me bats pour comprendre la dernière entrée dans la trace de la pile estC# .Net CF Form.Invoke augmenter ArgumentException

System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, 
       Binder binder, Object[] parameters, CultureInfo culture, 
       Boolean verifyAccess, StackCrawlMark& stackMark) 

Lorsque je fais un pas dans la DeviceResponse est peuplé comme je l'espère et la cible se trouve et comme prévu mais le targetForm.Invoke jette chaque fois

Toute aide serait grandement appréciée.

L'événement est défini comme:

public static event EventHandler<MsgEventArgs<DeviceResponse>> DeviceResponseReceived; 

L'événement est porté de ce code:

//Raise the event 
if (DeviceResponseReceived != null) 
{ 
    if (DeviceResponseReceived.Target is System.Windows.Forms.Form) 
    { 
     System.Windows.Forms.Form targetForm = DeviceResponseReceived.Target as System.Windows.Forms.Form; 
     targetForm.Invoke(DeviceResponseReceived, new MsgEventArgs<DeviceResponse>(deviceResponse)); 
    } 
} 

Les MsgEventArgs est un argument d'événement générique de classes dérivée de EventArgs:

public class MsgEventArgs<T> : EventArgs 
{ 
    public MsgEventArgs(T value) 
    { 
     m_value = value; 
    } 
    private T m_value; 
    public T Value 
    { 
     get { return m_value; } 
    } 
} 

Dans mon formulaire je me suis inscrit à l'événement dans le constructeur de formulaires:

DeviceResponse.DeviceResponseReceived += new EventHandler<MIASmartClient.Messaging.Transport.MsgEventArgs<DeviceResponse>>(DeviceResponse_DeviceResponseReceived); 

Avec la mise en œuvre:

void DeviceResponse_DeviceResponseReceived(object sender, MIASmartClient.Messaging.Transport.MsgEventArgs<DeviceResponse> e) 
{ 
    _presenter.DeviceResponseReceived(e.Value); 
} 

Merci d'avoir pris le temps de jeter un oeil

+0

En lisant les choses de manière plus approfondie, je suggère une approche différente. Mais c'est vraiment difficile car toutes les déclarations sont prises hors contexte dans la question; Je ne peux pas déterminer dans quelle classe l'événement est déclaré et comment il est lié au formulaire cible. Pourriez-vous mettre à jour les questions avec un échantillon de code plus complet (du moins pour qu'il soit clair dans quelles classes différents éléments sont déclarés et exécutés)? –

Répondre

5

De l'Msdn article sur les événements:

Les événements sont un type particulier de délégué multicast qui ne peut être invoqué à partir dans la classe ou struct où ils sont déclarés (la classe éditeur).

Cela a du sens. La classe qui déclare l'événement (éditeur) doit être la seule à déterminer quand et où l'événement est déclenché. C'est également la raison pour laquelle l'événement n'expose que certaines opérations au code client (abonné), telles que subscribe et unsubcribe.

Dans votre code, vous passez l'événement DeviceResponseReceived en tant qu'argument délégué dans targetForm.Invoke et attendez qu'il soit appelé par la cible (Form). La cible n'est pas où l'événement est déclaré, d'où l'exception.

Vous souhaitez vous assurer que le gestionnaire d'événements DeviceResponse_DeviceResponseReceived est exécuté sur le thread de l'interface utilisateur, car il est susceptible de toucher les composants de l'interface utilisateur. Ensuite, vous pouvez vérifier si InvokeRequired. Consultez WinForms UI Thread Invokes pour plus d'informations sur la mise à jour de l'interface utilisateur à partir d'autres threads.

0

Sans avoir essayé le code, l'une chose me frappe étrange dans le code suivant:

if (DeviceResponseReceived != null) 
{ 
    if (DeviceResponseReceived.Target is System.Windows.Forms.Form) 
    { 
     System.Windows.Forms.Form targetForm = DeviceResponseReceived.Target as System.Windows.Forms.Form; 
     targetForm.Invoke(DeviceResponseReceived, new MsgEventArgs<DeviceResponse>(deviceResponse)); 
    } 
} 

vous vérifiez si le délégué DeviceResponseReceived (je suppose qu'il est?) est attribué, puis vous dites targetForm pour appeler ce délégué. Où le délégué pointe-t-il réellement? Je suppose que ce que vous voulez est d'invoquer la méthode correspondante dans targetForm?

+0

Bonjour Fredrik Toutes mes excuses pour mon manque de connaissances, je pourrais être vous compréhension mal mais j'ai défini DeviceResponseReceivied comme un événement dans la même classe: événement public static EventHandler > DeviceResponseReceived Je me attendais appelez pour élever l'événement au formulaire souscrit sur le thread UI correct. Ai-je manqué quelque chose de fondamental? – SimonNet

Questions connexes