1

我有一个设备,如果我发送格式正确的字符串;我得到一个字符串。我想在 WPF ListView 控件中使用这个返回的字符串,但我无法无限地查询串行端口另一端的设备。我想每 3 秒左右刷新一次数据。
下面是应用逻辑:

            public static void queryDevice()
        {
            SerialPort _serialPort = new SerialPort("COM3", 115200, Parity.None, 8, StopBits.One);
            _serialPort.Handshake = Handshake.None;
            ObservableCollection<string> store= new ObservableCollection<string> { " ", " ", " " };
            string[] query = new string[3] { "t02", "t03", "t04" };
            while (true)
            {
                for (int i = 0; i < 3; i++)
                {
                    string add = SerialCom.returnData(query[i], _serialPort);//returns data depending on which query was sent
                    if (store[i] != add)
                    {
                        store.Add(add);
                    }
                }
                Thread.wait(300);

            }
        }

我正在尝试找到线程化此代码的最佳方法,因为将此代码放入 UI 线程会锁定 UI 线程。我计划使用 ObservableCollection 作为该笔记上 ListView 的数据源。

谢谢!

4

2 回答 2

2

在我看来,您应该将这些代码分成两种方法并使用线程..

也许像这样

    public static void queryDevice()
    {
        SerialPort _serialPort = new SerialPort("COM3", 115200, Parity.None, 8, StopBits.One);
        _serialPort.Handshake = Handshake.None;
        ObservableCollection<string> store= new ObservableCollection<string> { " ", " ", " " };
        string[] query = new string[3] { "t02", "t03", "t04" };
        Thread thread = new Thread(delegate(){Process(store,query,_serialPort);});
        thread.Start();
    }



     public static void Process(ObservableCollection<string> store, string[] query, SerialPort _serialPort)
     {
         while (true)
         {
             for (int i = 0; i < 3; i++)
             {
                 string add = SerialCom.returnData(query[i], _serialPort);
                 if (store[i] != add)
                 {
                     store.Add(add);
                 }
             }
             Thread.Sleep(300);
         }
     }
于 2012-10-30T04:16:50.180 回答
0

虽然在这种特殊情况下这超出了您的实际需要,但我通常将生产者/消费者模式用于此类事情。仅仅因为我知道我在做什么,线程是错误往往很容易潜入并且很难发现的事情之一。

对于 C# 实现,请查看在 C# 中实现生产者/消费者模式

在我学习时学到的所有东西中,这已被证明是最有用的;D

提示:生产者和消费者有自己的线程,消费者填充ObservableCollection.

免责声明:有更高效/更精简的解决方案,所以如果这是另一个解决方案的要求,那么你可能没有使用 WPF ;D

于 2012-10-30T00:17:45.983 回答