Псевдо асинхронное чтение с использованием многопоточности в C#
Я разрабатываю приложение winforms с использованием C#. Это приложение использует ThingMagic с USB плюс RFID-меток "M5e" ридер для сканирования тегами, которые нашли. У меня есть руководство читателя, который является Mercury API, и он предоставляет образец кодлета. В прилагаемых примерах нет ни одного псевдо-асинхронного примера, но я понимаю концепцию, она нуждается в многопоточности, и у меня нет опыта работы с потоками.
Краткое описание интерфейса, который у меня есть сейчас, у него есть Gridview, который будет отображать отсканированные теги с использованием синхронного доступного "которые приводят к чтению один раз", мне нужно, чтобы это был псевдо-асинхронный подход. Итак, просто я хочу, чтобы операция чтения выполнялась в отдельном потоке.
Это захват из руководства.
Pseudo-Asynchronous Reading In pseudo-asynchronous reading a synchronous search is looped over and over again running indefinitely in a separate thread. Tags are off-loaded once every synchronous search is completed. i.e., read listeners will be called once for every “/reader/read/ asyncOnTime” milliseconds. On all readers except the M6 and M6e pseudoasynchronous reading is the only implementation used for background reading operations.
Также смотрите эту ссылку, это похожая проблема, но я не смог ее реализовать.
c# - использование вызова begin/end с непрерывным RFID-считыванием-переполнение стека[^]
Что я уже пробовал:
<pre>public Reader objReader = null; // Create reader object that reads the scanned tags. private ReadTags[] arr1 = new ReadTags[0]; private ReadTags[] arr = null; public MyCart() { InitializeComponent(); //UpdateComport(); dataGrid1.DataSource = arr1; generatedatagrid(); } public void generatedatagrid() { DataGridTableStyle tableStyle = new DataGridTableStyle(); tableStyle.MappingName = arr1.GetType().Name; // record instance DataGridTextBoxColumn tbcName = new DataGridTextBoxColumn(); tbcName.Width = dataGrid1.Width * 50 / 100; tbcName.MappingName = "ProName"; tbcName.HeaderText = "Product Name"; tableStyle.GridColumnStyles.Add(tbcName); tbcName = new DataGridTextBoxColumn(); tbcName.Width = dataGrid1.Width * 25 / 100; tbcName.MappingName = "ProPrice"; tbcName.HeaderText = "Price"; tableStyle.GridColumnStyles.Add(tbcName); tbcName = new DataGridTextBoxColumn(); tbcName.Width = dataGrid1.Width * 25 / 100; tbcName.MappingName = "ReadCount"; tbcName.HeaderText = "Quantity"; tableStyle.GridColumnStyles.Add(tbcName); //tbcName = new DataGridTextBoxColumn(); //tbcName.Width = dataGrid1.Width * 12 / 100; //tbcName.MappingName = ""; //tbcName.HeaderText = "Total"; //tableStyle.GridColumnStyles.Add(tbcName); dataGrid1.TableStyles.Clear(); dataGrid1.TableStyles.Add(tableStyle); // bind } <pre> private void btnReadOnce_Click(object sender, EventArgs e) { try { //int TotalTagCount = 0; btnReadOnce.Enabled = false; TagReadData[] tagID = objReader.Read(int.Parse(tbxReadTimeout.Text)); arr = new ReadTags[tagID.Length]; for (int i = 0; i < tagID.Length; i++) { arr[i] = new ReadTags(tagID[i]); //TotalTagCount = TotalTagCount + tagID[i].ReadCount; } dataGrid1.DataSource = arr; generatedatagrid(); //lblTotalTagCount.Text = TotalTagCount.ToString(); //lblUniqueTagCount.Text = tagID.Length.ToString(); btnReadOnce.Enabled = true; btnReadOnce.Focus(); } catch (IOException ex) { MessageBox.Show(ex.Message, "Error"); objReader.Destroy(); objReader = null; btnReadOnce.Enabled = false; btnConnect.Text = "Connect"; } catch (Exception ex) { MessageBox.Show(ex.Message, "Reader Message"); btnReadOnce.Enabled = true; } } private void btnConnect_Click(object sender, EventArgs e) { try { if (btnConnect.Text.Equals("Connect")) { String model = string.Empty; string readeruri = "COM3"; //comboBox1.SelectedItem.ToString(); objReader = Reader.Create(string.Concat("eapi:///", readeruri)); objReader.Connect(); model = (string)objReader.ParamGet("/reader/version/model"); Reader.Region regionToSet = (Reader.Region)objReader.ParamGet("/reader/region/id"); if (objReader is SerialReader) { //if (regionToSet == Reader.Region.UNSPEC) //{ // if (model.Equals("M6e PRC")) // { // regionToSet = Reader.Region.PRC; // } // else // { // regionToSet = Reader.Region.NA; // } regionToSet = Reader.Region.OPEN; } objReader.ParamSet("/reader/region/id", regionToSet); if (model.Equals("M5e")) { SimpleReadPlan plan = new SimpleReadPlan(new int[] { 1 }, TagProtocol.GEN2); objReader.ParamSet("/reader/read/plan", plan); } //if (model.Equals("M6e Nano")) //{ // SimpleReadPlan plan = new SimpleReadPlan(new int[] { 1 }, TagProtocol.GEN2); // objReader.ParamSet("/reader/read/plan", plan); //} btnConnect.Text = "Disconnect"; btnReadOnce.Enabled = true; comboBox1.Enabled = false; btnRefresh.Enabled = false; lblReadTimeout.Enabled = true; tbxReadTimeout.Enabled = true; UpdateGrid(); } else { objReader.Destroy(); objReader = null; btnReadOnce.Enabled = false; comboBox1.Enabled = true; lblReadTimeout.Enabled = false; tbxReadTimeout.Enabled = false; btnConnect.Text = "Connect"; btnRefresh.Enabled = true; lblTotalTagCount.Text = "0"; lblUniqueTagCount.Text = "0"; } } catch (IOException ex) { MessageBox.Show(ex.Message, "Error"); objReader.Destroy(); objReader = null; btnReadOnce.Enabled = false; btnConnect.Text = "Connect"; } catch (Exception ex) { MessageBox.Show(ex.Message, "Reader message"); } } public class ReadTags { private string epc; // hexa ID //private string timestamp; private string readcount; // Quantity //public string rssi; private string proName; // pro name private string proPrice; // pro proice private int idDec; // Converted id public ReadTags() { } public ReadTags(TagReadData adddata) { epc = adddata.EpcString; idDec = int.Parse(epc, System.Globalization.NumberStyles.HexNumber); //timestamp = adddata.Time.ToString(); readcount = adddata.ReadCount.ToString(); //rssi = adddata.Rssi.ToString(); }