Я сделал небольшую тестовую программу, чтобы попытаться заставить устройство чтения карт USB работать с использованием элемента управления ActiveX, предоставленного производителем.
Форма работает нормально, если она не использует отдельный поток,Я создаю новый экземпляр Reader
и слушаю событие Read
, и все работает отлично.Я провожу карточкой, событие запускается и текстовое поле обновляется.
private Reader _reader;
public Form1()
{
InitializeComponent();
CreateScanner();
}
public void CreateScanner()
{
_reader = new Reader();
_reader.Read += Read;
}
void Read(object sender, EventArgs e)
{
CardData.Text = "Card Read";
}
Класс Reader, если он помогает:
public class Reader
{
private AxUSBHIDInsert _axUsbHid;
public event EventHandler Read;
public Reader()
{
_axUsbHid = new AxUSBHIDInsert();
_axUsbHid.CreateControl();
_axUsbHid.BeginInit();
_axUsbHid.MSRReadDir = MSRReadDirection.ReadWithdrawal;
_axUsbHid.EndInit();
_axUsbHid.PortOpen = true;
_axUsbHid.CardDataChanged += CardDataChanged;
}
void CardDataChanged(object sender, EventArgs e)
{
if (Read != null)
Read(this, new EventArgs());
}
}
Однако мне нужно запустить это в отдельном потоке,Поэтому я изменяю конструктор на
Thread thread = new Thread(CreateScanner);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
Это должен быть поток STA, в противном случае элемент управления ActiveX будет жаловаться на невозможность его создания.Однако, делая это, событие больше не срабатывает.Я не очень знаком с тем, как работает многопоточность, поэтому я не уверен, почему.
Есть идеи?Обратите внимание, что он должен работать таким образом (отдельный поток, подключенный к событию Read), потому что код в конечном итоге будет находиться в библиотеке классов, которая развернута с приложением, которое я не могу изменить.