线程间通信的同步机制(ConcurrentQueue)

假设需要实现的功能:

创建两个线程,一个用来读取数据,一个用来更新数据。

使用 ConcurrentQueue 来存放读取到的数据,然后使用 TryTake 或者 TryDequeue 来判断队列是否有新数据,如果有则更新 UI。

csharp 复制代码
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数据更新不及时的问题。

相关推荐
xiaoshuaishuai83 小时前
C# AI实现PR处理、单元测试
开发语言·c#·log4j
LONGZHIQIN3 小时前
C#基础复习笔记
开发语言·笔记·c#
时代的狂5 小时前
如何理解 C#/.NET 的依赖注入与生命周期
c#·.net·依赖注入·控制反转
品尚公益团队6 小时前
C#在asp.net网页开发中的带cookie登录实现
前端·c#·asp.net
吴可可1236 小时前
C#自定义CAD多段线零件实体
c#
CallmeFoureyes6 小时前
使用 C# 提取 Word 文档中的表格数据
开发语言·c#·word
思麟呀6 小时前
在C++基础上理解CSharp-7
java·jvm·c++·c#
杰佛史彦明18 小时前
ElasticSearch中的分词器详解
大数据·elasticsearch·c#
czhc11400756639 小时前
710:CT分辨率;BGA;DBC;[ObservableProperty],[Required]
c#
我才是银古10 小时前
当 GIS 开发遇上 .NET:一个 GDAL 集成工具库的架构设计与实践
c#·gis·gdal