none
Chartコントロールの更新を繰り返すとエラー発生してしまう RRS feed

  • 質問

  • いつもお世話になっております。
    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日 2:42

回答

  • 推測に過ぎませんが、DataSource に設定している DataTable を別スレッドで更新していませんか?

    不可思議な例外が出るときは、たいてい想定されていないことをしたときに起こります。
    本来、スレッド間で保護すべきものを保護していないときは、タイミングによってよくわからない例外が出るかもしれません。
    スレッド間で何か共通で使っているものがないか、それはきちんと保護されているか、参照レベルで共有されていないかなど疑ってみてください。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

    2012年4月25日 13:29
    モデレータ

すべての返信

  • 推測に過ぎませんが、DataSource に設定している DataTable を別スレッドで更新していませんか?

    不可思議な例外が出るときは、たいてい想定されていないことをしたときに起こります。
    本来、スレッド間で保護すべきものを保護していないときは、タイミングによってよくわからない例外が出るかもしれません。
    スレッド間で何か共通で使っているものがないか、それはきちんと保護されているか、参照レベルで共有されていないかなど疑ってみてください。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

    2012年4月25日 13:29
    モデレータ
  • > Azuleanさん

    早速のご回答ありがとうございます。
    ご推察の通り、外部からデータ取得し共通DataTableに書き込むスレッドと、共通DataTableから表示を更新するスレッドは別のものとなっております。
    質問投稿後、その辺が怪しいとも思い、lock等の排他制御を見直してみたところ、1時間以上実行しても当現象は発生しなくなりました。
    (今のところですが。)

    しばらく、この状態で何度かテストして様子を見てみようと思います。
    テストに時間も要するので、結果につきましては暫くお時間頂くことをご容赦ください。

    2012年4月26日 0:30
  • 何度かテストして様子を見たところ、当現象は発生しませんでしたので、この質問を閉じさせていただきたいと思います。

    Azuleanさん、ご回答ありがとうございました。

    2012年5月2日 10:51