トップ回答者
Chartコントロールの更新を繰り返すとエラー発生してしまう

質問
-
いつもお世話になっております。
Chartコントロールを利用してリアルタイムなグラフ表示を行うアプリケーションを作っています。
リアルタイムな表示が必要な為、1秒間隔での表示更新を行っているのですが、しばらく実行すると
ArgumentNullExceptionが発生してしまいます。
DataBind()にて内部的に呼ばれるメソッドにて例外が発生してるようなのですが、実行開始から
10分や30分など時々により違ったタイミングで発生します。
色々と調べてみたのですが、お恥ずかしながら小生の力及ばずでいまいち良く分からず、
解消のきっかけすら見付けられずにいます。
もしお分かりになる方がお見えでしたら、エラーの発生原因や回避方法などご助言頂きたく存じます。
よろしくお願い致します。
表示更新については、以下コードを1秒間隔で実行しています。
// チャートの更新 chart.DataSource = dataTable; chart.DataBind(); chart.Invalidate();
※dataTableは、アプリ内部のみで保持するデータテーブル(DataTableクラス)です。(DBとの接続なし)
データ内容も確認しましたがNullは含まれておりません。(NaNは含んでおります。)
エラー内容は、次の通りです。
'System.ArgumentNullException' の初回例外が mscorlib.dll で発生しました。 System.ArgumentNullException: 値を Null にすることはできません。 パラメータ名: key 場所 System.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument) 場所 System.Collections.Generic.Dictionary`2.FindEntry(TKey key) 場所 System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value) 場所 System.Data.DataView.ResetRowViewCache() 場所 System.Data.DataView.UpdateIndex(Boolean force, Boolean fireEvent) 場所 System.Data.DataView.SetIndex2(String newSort, DataViewRowState newRowStates, IFilter newRowFilter, Boolean fireEvent) 場所 System.Data.DataView..ctor(DataTable table) 場所 System.Windows.Forms.DataVisualization.Charting.ChartImage.DataBind() 場所 RealTimeChartMonitor.RealTimeChartMonitorForm.updateDisplay() 場所 C:\Application\RealTimeChartMonitor\RealTimeChartMonitor\RealTimeChartMonitorForm.cs:行 457
追記:失礼しました。.NETのバージョンの記載が漏れていました。.NET 3.5 SP1です。- 編集済み みずたまおれんぢ 2012年4月25日 5:16
回答
-
推測に過ぎませんが、DataSource に設定している DataTable を別スレッドで更新していませんか?
不可思議な例外が出るときは、たいてい想定されていないことをしたときに起こります。
本来、スレッド間で保護すべきものを保護していないときは、タイミングによってよくわからない例外が出るかもしれません。
スレッド間で何か共通で使っているものがないか、それはきちんと保護されているか、参照レベルで共有されていないかなど疑ってみてください。質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
すべての返信
-
推測に過ぎませんが、DataSource に設定している DataTable を別スレッドで更新していませんか?
不可思議な例外が出るときは、たいてい想定されていないことをしたときに起こります。
本来、スレッド間で保護すべきものを保護していないときは、タイミングによってよくわからない例外が出るかもしれません。
スレッド間で何か共通で使っているものがないか、それはきちんと保護されているか、参照レベルで共有されていないかなど疑ってみてください。質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。