C# DataGridView绑定到字典并使用线程更新

C# DataGridView绑定到字典并使用线程更新,c#,dictionary,data-structures,C#,Dictionary,Data Structures,我使用以下示例代码将字典绑定到DataGridView 请先看上面的问题 不同之处在于,我正在从一个线程更新字典。(另一个类的事件处理程序) 我的事件处理程序如下所示 static void f_PriceChanged(Objet f, eventData e) { if (prices.ContainsKey(e.ItemText)) prices[e.ItemText] = e.price; else prices.Add(e.ItemT

我使用以下示例代码将字典绑定到DataGridView

请先看上面的问题

不同之处在于,我正在从一个线程更新字典。(另一个类的事件处理程序)

我的事件处理程序如下所示

static void f_PriceChanged(Objet f, eventData e)
{

    if (prices.ContainsKey(e.ItemText))
        prices[e.ItemText] = e.price;
    else
        prices.Add(e.ItemText, e.price);

}
更不用说价格被宣布为班级水平

我已经修改了按钮代码从原来的职位作为

    Button btn = new Button();
    btn.Dock = DockStyle.Bottom;
    btn.Click += delegate
    {                
        bl.Reset();
    };
    form.Controls.Add(btn);
在内部,字典会按预期更新,但网格不会更新。单击按钮生成异常

收集被修改;枚举操作可能无法执行


怎么办?

您必须使用lock语句来保护您的共享资源:字典

private object _lock = new object();

private void Reset()
{
    lock(_lock)
    {
        // your code here
    }
}

void f_PriceChanged(Objet f, eventData e)
{
    lock(_lock)
    {
        if (prices.ContainsKey(e.ItemText))
            prices[e.ItemText] = e.price;
        else
            prices.Add(e.ItemText, e.price);
    }

}
您必须使
f\u PriceChanged()
成为成员