线程安全的方式来填充/删除列表中的项目
本文关键字:删除列 列表 删除 项目 填充 安全 方式 线程 | 更新日期: 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