测量工作室图形,集合被修改异常

时间:2021-06-18 09:45:31

标签: c# measurement-studio

我有一个测量工作室 dll 的图形问题(我有几个这个类的实例)。几次出现后,我得到 Collection was modified; enumeration operation may not execute. 但异常未处理,所以我无法确切地看到它发生的位置。我在互联网上发红是因为我没有在 UI 线程中提供图形,但我认为我不在 UI 线程之外:

private delegate void del(double press, double temp, double press1);
private object graphic_mutex = new object();
private void UpdateView(double press, double temp, double press1)
{
    if (InvokeRequired)
        Invoke(new del (UpdateView), new object[] { press , temp, press1});
    lock (graphic_mutex)
    {
        _PressionLine.PlotYAppend(press);
        _TemperatureLine.PlotYAppend(temp);
        if (_isdoublePressureSensor == true)
            _PressionLine2.PlotYAppend(press1);
    }
}

我得到的确切错误:

Exception thrown: 'System.InvalidOperationException' in mscorlib.dll
An unhandled exception of type 'System.InvalidOperationException' occurred in mscorlib.dll
Collection was modified; enumeration operation may not execute.

你有解决这个问题的想法吗?

1 个答案:

答案 0 :(得分:1)

您应该在调用后返回。当 InvokeRequired 为 true 时,您不希望代码执行两次。代码可以直接执行,也可以通过调用执行。两者都不是。

private delegate void del(double press, double temp, double press1);
private object graphic_mutex = new object();
private void UpdateView(double press, double temp, double press1)
{
    if (InvokeRequired)
    {
        Invoke(new del (UpdateView), new object[] { press , temp, press1});
        return;
    }
    
    lock (graphic_mutex)
    {
        _PressionLine.PlotYAppend(press);
        _TemperatureLine.PlotYAppend(temp);
        if (_isdoublePressureSensor == true)
            _PressionLine2.PlotYAppend(press1);
    }
}

不需要锁,因为它(必须)总是在 UI 线程上执行。