BindingList.Clear()导致交叉线程操作异常

时间:2018-03-01 14:30:14

标签: c# multithreading winforms bindinglist

我有一个UI类和一个Class,表示我需要填充UI类DGV的调用。当我在worker类中调用Bindinglist.Clear()时,我得到了DGV的跨线程操作异常。我查看了.Invoke的建议,但由于工人类中出现错误,我不明白我把它放在哪里。

继承工人阶级。 DisplayArray是一个静态绑定列表:

private void Get_ByHarvestDate(DateTime HarvestDate)
{
    try
    { 
    Lots Ls = new Lots();


    DataTable _plantLots = DataHelper.ExecuteProc("[Abattoir].[Lots_Select_ByHarvestDate]",
        new ProcParams("HarvestDate", HarvestDate), DataBaseMaster.PlantConnectionString);

    if (_plantLots.Rows.Count > 0)
        DisplayArray.Clear();//<---error here
    foreach (DataRow Row in _plantLots.Rows)
    {
        Lot L = FillLots(Row);
        // if (!Ls.ContainsKey(L.Lot_No))
        Ls.Add(L.Lot_No, L);
    }

    foreach (DataRow Row in _plantLots.Rows)
    {
        LotCacheItem _lc = new LotCacheItem();
        _lc.Lot_No = Row.Field<short>("Lot_No");
        _lc.HeadCount = Row.Field<int>("HeadCount");
        _lc.ProducerName = Row.Field<string>("Producername");
        _lc.BloodPittedCount = GetBloodPittedCount(_lc.Lot_No);
        DisplayArray.Add(_lc);
    }
    LotsDictionary?.Clear();
    LotsDictionary = Ls;
    }
    catch (Exception _e)
    {
        MessageWindow.Show("", _e.Message);
    }
}

_plantLots只是来自查询的数据表,所以当它有行时,我想清除列表并重新填充。

以下是UI类ListChanged处理程序:

private void HandleGridUpdate(object sender, EventArgs e)
{
    try
    {
        DgvLots.AutoGenerateColumns = false;
        DgvLots.DataSource = null;
        DgvLots.DataSource = LotCache.DisplayArray;
        lotDisplay_Current.UpdateLot(_currentLot);
        SelectGridRow(_currentLot.Lot_No);
    }
    catch (Exception _e)
    {
        MessageWindow.Show("", _e.Message);
    }
}

我不明白为什么我会收到此错误(我认为这是在ListUpdated回调中),这使得修复很难。

0 个答案:

没有答案