线程安全的方式来填充/删除列表中的项目

本文关键字:删除列 列表 删除 项目 填充 安全 方式 线程 | 更新日期: 2023-09-27 18:16:23

我有两个辅助线程在c# Win应用程序中运行。

第一个线程读取Sql Server配置文件消息,并将其作为字符串添加到列表框中以形成某种队列。另一个线程将一个接一个地发送这些跟踪消息,并相应地从列表中删除它们。

现在我非常肯定它会引起问题。任何确保只有一个线程能够访问以下两个函数之一的方法:

    void AddItemThreadSafe(string item)
    {
        this.Invoke((MethodInvoker)delegate
        {
            listBoxCollection.Items.Add(item);
        });
    }
    void RemoveItemThreadSafe()
    {
        this.Invoke((MethodInvoker)delegate
        {
            listBoxCollection.Items.RemoveAt(0);
        });
    }

线程安全的方式来填充/删除列表中的项目

通常,使用lock来同步线程对一段代码的访问。

private static object listLocker = new object();
void AddItemThreadSafe(string item)
{
    this.Invoke((MethodInvoker)delegate
    {
        lock (listLocker)
        {
            listBoxCollection.Items.Add(item);
        }
    });
}
void RemoveItemThreadSafe()
{
    this.Invoke((MethodInvoker)delegate
    {
        lock (listLocker)
        {
            listBoxCollection.Items.RemoveAt(0);
        }
    });
}

在这个特殊的情况下(如果我错了,有人纠正我),我相信您从同一个对象调用方法已经同步了访问,使锁冗余。

好消息是表单上的Invoke方法已经为您同步了。这就是Invoke的全部要点:将方法/委托排队,以便它运行在创建表单的唯一UI线程上。

使用内置线程安全集合像ConcurrentBag类

从你的问题中我看到你需要某种队列,所以使用ConcurrentQueue Class