【问题标题】:JSON.NET interfering with MSChart datesJSON.NET 干扰 MSChart 日期
【发布时间】:2014-09-03 16:26:27
【问题描述】:

问题

我遇到了一个问题,使用 json.net 反序列化任何值(甚至是虚拟值)似乎会弄乱我的 mschart 控件的 x 轴上的日期。这是一张应该在 x 轴上有日期值的图表:

===不好===

图表由以下最少代码生成:

using System.Windows.Forms.DataVisualization.Charting;
using System.Threading;
using Newtonsoft.Json;

public partial class Form1 : Form
{
    Thread thread;

    public Form1()
    {
        InitializeComponent();

        chart1.Dock = DockStyle.Fill;

        thread = new Thread(Plot);
        thread.Start();
    }

    void Plot()
    {
        // prepare chart
        chart1.Invoke((MethodInvoker)delegate
        {
            chart1.ChartAreas.Clear();
            chart1.Series.Clear();

            ChartArea area = new ChartArea();
            chart1.ChartAreas.Add(area);

            Series series = new Series("water level");
            series.ChartArea = area.Name;
            series.ChartType = SeriesChartType.Line;
            chart1.Series.Add(series);
        });

        // plot line by adding 2 points: ((time)0, 0) and ((time)1, 1)
        for (int i = 0; i < 2; i++)
        {
            object dummy = JsonConvert.DeserializeObject<object>("null");

            chart1.Invoke((MethodInvoker)delegate
            {
                DateTime time = new DateTime(1970, 1, 1, 0, 0, i, DateTimeKind.Utc);

                chart1.Series["water level"].Points.AddXY(time, i);
            });
        }
    }
}

注释掉以下行的唯一 json.net 行会产生预期的结果:

object dummy = JsonConvert.DeserializeObject<object>("null");

===好===

问题

我的代码有问题吗?

更新

我只是用

替换了相关行
Thread.Sleep(5000);

问题仍然存在。我想也许我过早地修改图表。但现在,我不知道该怎么做。

【问题讨论】:

  • 我怀疑它在某种程度上破坏了你的文化。 json.net调用前后CultureInfo.CurrentCulture的值是多少?
  • 前后都是“en-US”
  • 我也可以重现这个。很奇怪。
  • 哦。那挺好的”。那么这不是本地问题
  • 我不认为这个问题是由 json.net 专门引起的。我只是用我自己的 json 解析器尝试过,同样的事情发生了

标签: c# multithreading json.net mschart


【解决方案1】:

我查看了 Series 对象的属性,发现 XValueType 设置为“Double”。所以我尝试在创建它时将其显式设置为“DateTime”,这解决了问题:

Series series = new Series("water level");
series.ChartArea = area.Name;
series.XValueType = ChartValueType.DateTime; /* <---- added this line */
series.ChartType = SeriesChartType.Line;
chart1.Series.Add(series);

默认设置为“自动”,显然并不总是设置为“日期时间”。我想我应该更早地查看这些属性。

这对我来说仍然是一个奇怪的问题,我不知道是什么原因造成的,所以这更像是一种解决方法。

【讨论】:

    猜你喜欢
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多