线程间通信的同步机制(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数据更新不及时的问题。

相关推荐
前端 贾公子3 小时前
LangChain核心组件 == 提示词(Prompts)
开发语言·c#
码艺-Alimjan5 小时前
Web 网站打包桌面应用的另一种方式,超级简单(C# exe 33Kb)
开发语言·前端·c#
海天鹰6 小时前
C#入门:显示窗口
c#
淡海水6 小时前
16-02-C#常用数据结构源码-附录B-源码索引速查
unity·c#·游戏引擎·il2cpp
海天鹰7 小时前
C#入门:在cmd显示字符
c#
波力海苔夹心脆67519 小时前
C# 序列化与反序列化详解:System.Text.Json、Newtonsoft.Json、XmlSerializer 用法、特性选项与安全实践
经验分享·后端·c#·json·.net
小羊没烦恼!1 天前
在Scrum中实施敏捷建模
java·开发语言·windows·算法·c#
Lost of 程序猿1 天前
建造者模式实战:告别“十参数构造函数“的数据导出任务
后端·设计模式·c#·asp.net
mudtools1 天前
在.NET现有系统中快速集成飞书任务分配能力
后端·c#·.net
工具派1 天前
Word文档太大怎么拆分?段落结构与两种拆法的边界实测
开发语言·c#·word