2

我有 2 个辅助线程在 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);
        });
    }
4

3 回答 3

5

一般来说,使用 alock来同步线程对一段代码的访问。

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);
        }
    });
}

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

于 2013-06-02T12:31:39.410 回答
2

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

于 2013-06-02T13:37:53.890 回答
1

使用内置的线程安全集合 ,如ConcurrentBag 类

根据您的问题,您需要某种队列,因此请使用ConcurrentQueue 类

于 2013-06-02T12:46:30.517 回答