2017-06-30 2 views
0

Ich arbeite an einem Projekt, das mehrere RFID-Lesegeräte gleichzeitig überwachen muss. Der RFID-Leser verfügt über eine DLL-Datei, die Methoden zur Interaktion mit ihm offen legt. Eine Methode besteht darin, eine Verbindung zu ihr zu öffnen. Wenn ich die statische DLL anrufe, um eine Verbindung zu einem einzelnen RFID-Lesegerät herzustellen, funktioniert das problemlos. Wenn ich mehrere Instanzen meiner App benutze, rufen sie alle die statische DLL auf und verbinden sich mit verschiedenen RFID-Lesegeräten. Allerdings muss ich nur eine einzige Instanz meiner Hauptanwendung ausführen und dann einzelne Threads mit einzelnen RFID-Lesegeräten verbinden. Aber wenn ich das tue, ist die erste Verbindung erfolgreich, aber alle anderen Threads können die DLL nicht aufrufen, da ich annehme, dass sie sich in einem gemeinsamen Speicherbereich befindet und daher vom ersten Thread beansprucht wird. Wie kann ich dieses Problem lösen?Statische DLL für RFID Reader aus mehreren Threads aufrufen

Hier ist die DoWork fucntion die

durch Thread.Start genannt
public void DoWork() 
    { 

     __parent.UpdateLog(ReaderIP + ": working."); 
     int openresult = 0; 
     int frmcomportindex = 0; 
     int fOpenComIndex; 
     byte fComAdr = Convert.ToByte("FF", 16); // $FF 

     //this line works fine for the first thread adn fails for all following threads 
     // but works fine if I run multiple instances of my app and get each to connect to a single RFID reader 
     openresult = StaticClassReaderB.OpenNetPort(ReaderPort, ReaderIP, ref fComAdr, ref frmcomportindex); 
     fOpenComIndex = frmcomportindex; 
+0

Überprüfen Sie diese: https://msdn.microsoft.com/en-us/library/system.threading.thread.beginthreadaffinity(v=vs.110).aspx – Fruchtzwerg

Antwort

0

Eine statische Variable ist eine Variable, die pro Prozeß eindeutig ist. Eine statische Methode verwendet wahrscheinlich statische Variablen, sodass alle Aufrufe einer statischen Methode, die aus demselben Prozess stammen, die gleichen Daten verwenden. Ein Prozess kann natürlich aus mehreren Threads bestehen; Jeder Thread in einem Prozess wird dieselbe Kopie der statischen Daten haben.

Wenn Sie die statische DLL aus einem einzigen Prozess verwenden, gibt es natürlich kein Problem.

Wenn Sie die statische DLL aus mehreren Prozessen verwenden, scheint kein Problem zu sein, da jeder Prozess eine eigene Kopie statischer Daten erhält. (Beachten Sie, dass möglicherweise ein verborgenes Problem vorliegt, wenn die statischen Methoden systemübergreifende globale Ressourcen wie I/O-Handles verwenden).

Wenn Sie jedoch die statische DLL aus einem einzigen Prozess mit mehreren Threads verwenden, können sich die Threads gegenseitig stören, da sie alle eine Kopie der statischen Daten verwenden.

Der beste Weg, damit umzugehen, ist, die Dokumentation für die statische Bibliothek zu lesen und ihren Empfehlungen zu folgen. Es ist möglich, dass die Verwendung der Bibliothek aus mehreren Threads einfach nicht möglich ist. Darüber hinaus kann es sein, dass der Aufruf aus mehreren Prozessen versteckte Probleme verursacht, die Ihnen nicht bekannt sind.

Verwandte Themen