假设需要实现的功能:
创建两个线程,一个用来读取数据,一个用来更新数据。
使用 ConcurrentQueue 来存放读取到的数据,然后使用 TryTake 或者 TryDequeue 来判断队列是否有新数据,如果有则更新 UI。
private readonly ConcurrentQueue<string> _dataQueue = new ConcurrentQueue<string>();
private void DataReadingThread()
{
while (true)
{
string data = ReadData();
if (!_dataQueue.Contains(data))
{
_dataQueue.Enqueue(data);
}
}
}
private void UIUpdateThread()
{
while (true)
{
if (_dataQueue.TryDequeue(out string newData))
{
Dispatcher.Invoke(() =>
{
// 更新UI元素
// myLabel.Content = newData;
});
}
}
}
注意:
队列的原则是先进先出
读取数据的线程是一直往队列中存放数据的,为了保证更新的数据是最新的数据,更新UI的频率需要高于读取数据的频率,否则就会出现队列堆积数据,导致UI数据更新不及时的问题。