我正在开发一个必须同时监控多个RFID阅读器的项目。 RFID阅读器有一个DLL文件,它暴露了与之交互的方法。一种方法是打开与它的连接。当我调用静态DLL连接到单个RFID阅读器时,它工作正常。如果我运行我的应用程序的多个实例,他们都会调用静态DLL并连接到不同的RFID阅读器。但是,我只需要运行主应用程序的单个实例,然后将各个线程连接到各个RFID阅读器。但是当我这样做时,第一个连接成功,但任何其他线程都无法调用DLL,因为我认为它在共享内存空间中,因此由第一个线程参与。我该如何解决这个问题?
这是由Thread.Start调用的DoWork功能
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 :(得分:0)
静态变量是每个进程唯一的变量。静态方法可能使用静态变量,因此对来自同一进程的静态方法的所有调用都将使用相同的数据。当然,一个过程可以由多个线程组成;进程中的每个线程都将具有相同的静态数据副本。
当您在单个进程中使用静态DLL时,当然没有问题。
当您使用来自多个进程的静态DLL时,似乎不会出现问题,因为每个进程都有自己的静态数据副本。 (请注意,如果静态方法共享系统全局资源(如I / O句柄),则可能存在隐藏问题。)
但是当您使用来自具有多个线程的单个进程的静态DLL时,线程可能会相互干扰,因为它们共享一个静态数据副本。
处理此问题的最佳方法是阅读静态库的文档并遵循其建议。有可能使用来自多个线程的库是不可能的。此外,从多个进程调用它可能会导致您不知道的隐藏问题。