代码之家  ›  专栏  ›  技术社区  ›  Manjoor

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

  •  0
  • Manjoor  · 技术社区  · 15 年前

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

    DataGridView bound to a Dictionary

    请先看上面的问题

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

    我的事件处理程序如下

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

    字典在内部按预期更新,但网格不更新。点击按钮生成异常

    集合已修改;枚举操作可能无法执行

    怎么办?

    1 回复  |  直到 9 年前
        1
  •  1
  •   Seb    15 年前

    必须使用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_PriceChanged() 成员。