2016-09-06 4 views
0

Le code lanceManualResetEvent lance NullReferenceException: objet de référence non définie à une instance d'un objet

NullReferenceException: objet de référence non définie à une instance d'un objet

sur la ligne ((ManualResetEvent)handles[i]).Set(). J'ai vérifié les poignées [i] a une valeur quand je le débogue. Qu'est-ce que je fais mal?

`    string[] fileEntries = Directory.GetFiles(pathFife); 
       ManualResetEvent[] handles = new ManualResetEvent[fileEntries.Count()]; 
       int i = 0; 
       foreach (string fullName in fileEntries) 
       { 
        handles[i] = new ManualResetEvent(false); 
         var thread = new Thread(() => 
          { 
           AddFile(fullName, month, year, user); 
           ((ManualResetEvent)handles[i]).Set(); 
          }); 
         thread.Start(); 
        i++; 
       } 
       WaitHandle.WaitAll(handles);`  

Répondre

0

Ce qui se passe est que vous avez a modified closure sur i où il est utilisé à l'intérieur du fil.

La valeur de i est incrémenté avant il est utilisé dans ((ManualResetEvent)handles[i]).Set();, et à ce moment-là que vous avez pas encore la valeur de handles[i]. Cela se produit car le thread appelant passe immédiatement à la ligne de code suivante, i++;, avant que le nouveau thread ne soit exécuté ((ManualResetEvent)handles[i]).Set();. C'est une condition de course classique.

Pour résoudre ce problème, ajoutez la ligne suivante juste avant de commencer le fil:

int j = i;

Et puis utilisez j au lieu de i dans ((ManualResetEvent)handles[i]).Set();:

foreach (string fullName in fileEntries) 
{ 
    handles[i] = new ManualResetEvent(false); 
    int j = i; 
    var thread = new Thread(() => 
    { 
     AddFile(fullName, month, year, user); 
     ((ManualResetEvent)handles[j]).Set(); 
    }); 
    thread.Start(); 
    i++; 
} 

Bien sûr, quand vous exécutez le code sous le débogueur le threading est complètement modifié et donc vous n'avez pas vu le problème.

+0

@Downvoter: Vous voulez expliquer ce qui ne va pas avec cette réponse? La downvote n'est pas très utile à quiconque, sinon. –