Member 13097876 Ответов: 1

Псевдо асинхронное чтение с использованием многопоточности в 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();
}

1 Ответов

Рейтинг:
2

RickZeeland

Я думаю, что вам сначала нужно почитать Tasks (что является современным способом нитей).
Вот хорошая статья об этом: Библиотека параллельных задач: 1 н[^]
Как вы уже упоминали "псевдо", вероятно, лучше всего не позволять всем задачам одновременно обращаться к одному и тому же USB-порту.
При работе с задачами вы можете, например, использовать .ContinueWith чтобы начать другую задачу, когда она будет завершена.

О, и я бы также рекомендовал использовать DataSource или BindingList для вашего DataGrid вот отличная статья об этом: А-Вся-Привязки Данных-Учебник
Затем ваша задача может продолжать работать в фоновом режиме (длительная задача) и обновлять DataSource который автоматически обновляет DataGrid.