4 votes

Comment activer deux applications C# différentes accédant au même répertoire dans un fil continu ?

J'ai le même morceau de code BackgroundWorker dans deux applications s'exécutant simultanément. Ce code évitera-t-il le problème d'accès au même ressource par deux processus et fonctionnera-t-il correctement ?

void bw_DoWork(object sender, DoWorkEventArgs e)
    {
       bool flag = false;
       System.Threading.Thread.Sleep(1000);

       while (flag.Equals(false))
       {

           string dir = @"C:\ProgramData\Msgs";
           try
           {
               if (Directory.GetFiles(smsdir).Length > 0)
               {                      
                   flag = true;
               }

           }
           catch (Exception exc)
           {
               Logger.Log("Exception d'accès au répertoire : " + exc.Message);
               System.Threading.Thread.Sleep(10);
           }
       }

2voto

Wobbly Points 346

Non, cela ne résoudra pas le problème car définir la valeur du booléen et la vérifier n'est pas une fonction atomique et n'est donc pas thread safe. Vous devez utiliser soit un Mutex, soit un objet Monitor.

Vérifiez ce lien pour plus d'informations : Monitor vs Mutex en c#

2voto

David Yaw Points 13009

À un certain niveau, en fonction de ce que vous faites, il n'y a rien de mal à ce que plusieurs applications accèdent au même répertoire ou fichier. S'il s'agit simplement d'un accès en lecture, alors, par tous les moyens, les deux peuvent y accéder en même temps.

Si vous avez un code identique dans plusieurs applications, alors un booléen ne suffira pas pour la synchronisation, peu importe ce que vous faites : chaque application a sa propre copie de ce booléen et ne peut pas modifier l'autre.

Pour la synchronisation entre applications, j'utiliserais la classe Mutex. Il y a un constructeur qui prend un paramètre de type chaîne de caractères, spécifiant le nom de la Mutex. Les noms de Mutex sont uniques dans tout Windows, pas seulement dans votre application. Vous pouvez faire Mutex m = new Mutex(false, "MySpecialMutex"); dans deux applications différentes, et chaque objet fera référence à la même chose.

0voto

cdhowie Points 62253

Non, cela ne le fera pas - du moins, le code que vous avez copié ne réalisera aucune forme de synchronisation de processus significative.

Si vous voulez une réponse plus détaillée et utile, vous devrez être plus spécifique sur ce que vous faites.

0voto

edepperson Points 418

Non, 'flag' est local à la portée de la méthode, qui est locale à la portée du thread. En d'autres termes, il sera également égal à false.

C'est à cela que sert la fonction de verrouillage. Utilisez-la de cette manière Dans votre classe, déclarez un objet privé appelé gothread.

dans votre méthode écrivez-le de cette façon

lock(gothread)
{

// mettez votre code ici, un thread ne pourra pas entrer quand un autre thread est déjà 
// ici

}

0voto

kprobst Points 8360

Vous devez trouver un type de schéma de synchronisation inter-processus - tout mécanisme de verrouillage que vous utilisez dans ce code est sans importance si vous essayez d'empêcher les collisions entre deux processus plutôt que deux threads s'exécutant sur le même processus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X