2010-03-31 21 views
2

Je ne sais pas ce que je fais mal:C# - champ de classe est nulle quand on y accède à partir d'un thread de travail, mais pas thread principal

class MyClass 
{ 

    private EventInfo eventInfo; 

    public void OnGenerateEvent(object sender, EventArgs e) 
    { 
     // Called from *main* thread 

     // Load assembly and set eventInfo here 
     eventInfo = ....GetEvent(...); 
     eventInfo.AddEventHandler(source, handler); 

     // Call to a static method in another assembly 
     someMethodInfo.Invoke(null, null); 

    } 


    public void OnEventChanged(object sender, EventArgs args) 
    {  
     // Called from a *worker* thread created 
     // by that static method in the other assembly 

     eventInfo is null here ! 

     // Trying to remove handler 
     eventInfo.RemoveEventHandler(.....); 

    } 


    // But... 
    protected override void Dispose(bool disposing) 
    { 
     // Called from *main* thread when program closes 

     eventInfo is *not* null here 
    } 
} 

Répondre

3

Vous aurez besoin de faire au moins un des éléments suivants:

  • faire eventInfo volatile pour veiller à ce que tout OnGenerateEvent() écrit la sortie à la mémoire avant d'appeler someMethodInfo.Invoke()

  • utiliser quelque chose li ke un mutex/lock pour protéger l'accès à eventInfo. Cela permettra également de fournir les barrières de mémoire appropriés (ce qui est vraiment ce qui devrait être fait à mon avis)

Oh, et je suppose qu'il n'y a pas vraiment 2 différentes instances impliquées MyClass - qui ne peuvent pas être vérifié par le code que vous avez montré.

5

Je pense que nous aurions besoin de voir le code reproductible, mais je peux voir 4 scénarios:

  • vous parlez à une instance MyClass différente dans les deux cas - mon pari est ici
  • vous avez une variable appelée eventInfo dans l'une des méthodes (essayez d'utiliser this.eventInfo quand vous voulez dire le champ s'il y a toute ambiguïté)
  • l'écriture ou de lecture est mis en cache (essayez marquer le champ volatile, de nouveau peu probable)
  • un champ spécifique à fil (stockage de fil local) - très improbable

Les deux premiers sont beaucoup plus susceptibles.