c#表单应用程序标签不更新

时间:2014-06-30 06:58:04

标签: c# multithreading label rfid

大家好,这是我对stackoverflow的第一个问题,对不起我的英语。我搜索了一个星期,找不到解决方案。我正在开发一个使用RFID天线和标签的项目。一台机器读取标签并生成标签ID,如bcbc 0000或abab 1111 ......每个id都指向一个独特的产品,如衬衫,裤子等。这个程序是一个产品柜台。我的表单应用程序使用此id与产品的匹配并对其进行计数。当程序获得衬衫ID时,我想在阅读时增加表单上的“衬衫数量标签”。我写了两个不同的程序,都没有更新标签。

我的代码:

System.Timers.Timer aTimer = new System.Timers.Timer();
        aTimer.Interval = 2000;
        aTimer.Start();
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

阅读部分如下;

 reader.Connect(SolutionConstants.ReaderHostname);

            Settings settings = reader.QueryDefaultSettings();

            settings.Report.IncludeFastId = true;

            settings.Report.IncludeAntennaPortNumber = true; // WS

            settings.Antennas.GetAntenna(1).MaxTransmitPower = true;
            settings.Antennas.GetAntenna(1).MaxRxSensitivity = true;
            settings.Antennas.GetAntenna(2).MaxTransmitPower = true;
            settings.Antennas.GetAntenna(2).MaxRxSensitivity = true;
           ...... and other settings here....


            // Apply the newly modified settings.
            reader.ApplySettings(settings);

            // Assign the TagsReported event handler.
            // This specifies which method to call
            // when tags reports are available.
            reader.TagsReported += OnTagsReported;

            // Start reading.
            reader.Start();
在OntagsReported()函数中我做了一些控件,重要的部分是

tagList.Add(tag.Epc.ToString()); // adds tags to tagList.

计时器功能;

 private void OnTimedEvent(object source, ElapsedEventArgs e)
    {         
        for (int i = 0; i < tagList.Count; i++)
        {
            if (!usedTags.Contains(tagList[i]))
            {
                //MessageBox.Show("");
                label1.Text = "Text Updated.";
                //productCounter(tagList);
                usedTags.Add(tagList[i]);
            }
        }
    }

一切正常。如果控制,程序会持续。如果我在那里写了一个messageBox,它会显示但是在下一行标签上没有改变。谢谢你的帮助:)

2 个答案:

答案 0 :(得分:1)

System.Windows.Forms.Timer代替System.Timers.Timer可以帮助您。

System.Timers.Timer在非UI线程中触发事件, 所以你不应该直接在事件处理程序中访问UI控件。

答案 1 :(得分:0)

好像你需要编组调用UI线程。

label1.BeginInvoke(new Action(() => label1.Text = "Text Updated"));