2013-05-27 5 views
0

У меня действительно странная проблема с чтением карты Mifare 1k из приложения WinForm. Читатель, которого я использую, является устройством чтения смарт-карт PROMAG PCR-310U. Я использую этот код для чтения карты:Чтение Mifare 1k из приложения WinForm

MifareReader.CommPort = 4; 
MifareReader.PortOpen = true; 
MifareReader.mfRequest(); 
MessageBox.Show(MifareReader.mfAnticollision().ToString()); 
MifareReader.mfHalt(); 

код помещается внутри метода backgroundWorkers DoWork, и весь метод выглядит следующим образом:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 
     while (!worker.CancellationPending) 
     { 
      MifareReader.CommPort = 4; 
      MifareReader.PortOpen = true; 
      MifareReader.mfRequest(); 
      CardID = MifareReader.mfAnticollision().ToString();     
      MifareReader.mfHalt(); 
      if (CardID != "0" && CardID != string.Empty) 
      { 
       e.Result = CardID; 
       worker.CancelAsync(); 
       break; 
      } 
     } 
    } 

Читатель Я использую это Считыватель смарт-карт PROMAG PCR-310U и DLL GNetPlus и MifareReader. У меня есть приложение, где родительская форма создает дочернюю форму. Эта дочерняя форма считывает идентификатор смарт-карты и отправляет ее родителям. Проблема в том, что в первый раз, когда я создаю дочернюю форму, процесс чтения работает отлично, но во второй раз (и каждый раз после этого) я создаю ребенка, читатель перестает работать - он возвращает «0» в качестве идентификатора карты, независимо от того, карта присутствует или нет. Что может вызвать эту ошибку и как ее исправить?

+0

Проблема, скорее всего, в том, что 'MifareReader' имеет проблемы с несколькими потоками. Но невозможно ответить без указания кода «MifareReader». –

+0

К сожалению, этот класс является частью dll MifareReader, и у меня нет доступа к его метаданным только кода – NDraskovic

+0

Является ли 'mfRequest' статическим методом? Или это 'MifareReader' экземпляр класса? –

ответ

1

Скорее всего, проблема заключается в следующем:

После закрытия первого ребенка формируют экземпляр MifareReader не склонен или иным образом не знает, что он больше не требуется. Это означает, что он все еще контролирует читателя и, по-видимому, блокирует доступ ко всем другим экземплярам, ​​пытающимся получить доступ к этому читателю.
Один из таких заблокированных экземпляров - это MifareReader экземпляр в второй дочерняя форма, которую вы открываете.

Попробуйте сообщить, что он больше не требуется, закрыв порт через PortOpen = false;.

Смежные вопросы