2017-06-30 60 views
0

我正在研究一個項目,該項目必須同時監視多個RFID閱讀器。 RFID閱讀器有一個DLL文件,它公開了與之交互的方法。一種方法是打開一個連接。當我調用靜態DLL連接到一個RFID閱讀器時,它工作正常。如果我運行我的應用程序的多個實例,他們都會調用靜態DLL並連接到不同的RFID閱讀器。不過,我需要僅運行主應用程序的單個實例,然後將單個線程連接到單個RFID閱讀器。但是當我這樣做時,第一個連接是成功的,但任何其他線程都無法調用該DLL,因爲我認爲它在共享內存空間中,因此被第一個線程佔用。我怎麼解決這個問題?從多個線程調用RFID閱讀器的靜態DLL

這裏是DoWork的溫控功能是由Thread.Start

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

退房這一個:https://msdn.microsoft.com/en-us/library/system.threading.thread.beginthreadaffinity(v=vs.110).aspx – Fruchtzwerg

回答

0

稱爲靜態變量是一個變量,其是每個進程唯一的。靜態方法可能使用靜態變量,因此對來自同一進程的靜態方法的所有調用都將使用相同的數據。當然,一個過程可以由多個線程組成;一個進程中的每個線程將擁有相同的靜態數據副本。

當您使用靜態DLL從一個單一的過程中,當然沒有問題。

當您使用來自多個進程的靜態DLL,似乎沒有成爲一個問題,因爲每個進程都有自己的靜態數據的副本。 (請注意,如果靜態方法共享系統全局資源(如I/O句柄),則可能存在隱藏問題)。

但是當你從多線程一個進程使用靜態DLL,線程可以互相干擾,因爲它們的靜態數據都共享一個副本。

對付它的最好方法是閱讀的靜態庫文件,並按照其建議。使用多線程庫是不可能的。另外,從多個進程調用它可能會導致您不知道的隱藏問題。