1

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.

この問題を解決するアイデアはありますか?

4

1 に答える 1

1

呼び出し後に戻る必要があります。InvokeRequired が true の場合に、コードを 2 回実行したくありません。コードは直接実行できるか、呼び出しによって実行する必要があります。両方ではありません。

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 スレッドで実行される (する必要がある) ため、ロックは必要ありません。

于 2021-06-18T09:53:24.327 に答える