OXYPlotで"System.InvalidOperationException"の例外が発生したときの対応


OXYPlotでリアルタイムにグラフを更新していると以下の画像のような例外がplotmodelから発生することがあります。

この例外を発生させないようにするには、以下のようにInvalidatePlotにfalseを設定します。

InvalidatePlot(false)

以前の記事から少しアップデートです。プログラムの最後の行が変更点です。

プログラム例

PlotViewRefreashExample.cs
var myPlotModel = new PlotModel(); //PlotModelの生成
myPlotModel.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, Minimum = 0.0, Maximum = 1.0 }); //x軸の設定
myPlotModel.Axes.Add(new LinearAxis { Position = AxisPosition.Left, Minimum = 0.0, Maximum = 1.0 }); // y軸の設定

plotView1.Model = myPlotModel; // plotView1はPlotViewコントロール

LineSeries myLine = new LineSeries(); //データインスタンスを生成

myPlotModel.Series.Add(myLine); //データをPlotModelへバインド

for(int i = 0; i < 10; i++)
{

   myLine.Points.Add(new DataPoint(i, i)); //データの変更

   plotView1.Invalidate(); // PlotViewが更新される

   myPlotModel.Axes.Clear(); // 軸の変更のため、以前の設定をクリア
   myPlotModel.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, Minimum = 0.0, Maximum = i }); //x軸の設定
   myPlotModel.Axes.Add(new LinearAxis { Position = AxisPosition.Left, Minimum = 0.0 , Maximum = i }); //y軸の設定
   myPlotModel.InvalidatePlot(false); // -- 変更点 ---
}

InvalidatePlotの値はtrueでもfalseでも問題無いようです。

ちなみにですが、リアルタイム更新は5msecくらいでもプログラム的には可能です。しかし、FPSの観点から60FPS(約16msec間隔)にとどめておく方が良いです。