ZedGraph - 计时器还是线程?

时间:2013-01-09 12:34:14

标签: c# multithreading timer zedgraph

目前,我正在使用线程自动填充zedgraph chart。问题是它非常慢,对生产来说不好。

知道:
1.有Thread运行后台从远程服务器获取新数据并将其存储在本地文本文件中 2.还有另一个线程访问并从本地文件中读取数据并刷新zedgraph图表。

Personnaly我认为这会使应用程序运行得非常慢。
Timer组件可能更适合处理这类内容 有没有人有ZedGraph实时数据的经验?
或者欢迎任何建议。

编辑:更新用户界面
此外,我想知道如何更新线程中的UI,以便用户不必关闭并打开表单来查看图表。
感谢

1 个答案:

答案 0 :(得分:1)

我将采取的方式如下:

你创建了一个包含数据的类(这也可以是你已经拥有的类),我将称之为InformationHolder

class InformationHolder {
    private static InformationHolder singleton = null;
    public List<float> graphData; //Can be any kind of variable (List<GraphInfo>, GraphInfo[]), whatever you like best.

    public static InformationHolder Instance() {
        if (singleton == null) {
            singleton = new InformationHolder();
        }

        return singleton;
    }
}

现在你需要一个能在后台获取你的信息的类,解析它并将它插入到上面的类中。

Thread.Sleep()的示例:

class InformationGartherer {
    private Thread garthererThread;

    public InformationGartherer() {
        garthererThread = new Thread(new ThreadStart(GartherData));
    }

    private void GartherData() {
        while (true) {
            List<float> gartheredInfo = new List<float>();

            //Do your garthering and parsing here (and put it in the gartheredInfo variable)

            InformationHolder.Instance().graphData = gartheredInfo;

            graphForm.Invoke(new MethodInvoker( //you need to have a reference to the form
                   delegate {
                       graphForm.Invalidate(); //or another method that redraws the graph
                   }));

            Thread.Sleep(100); //Time in ms
        }
    }
}

Timer的示例:

class InformationGartherer {
    private Thread garthererThread;
    private Timer gartherTimer;

    public InformationGartherer() {
        //calling the GartherData method manually to get the first info asap.
        garthererThread = new Thread(new ThreadStart(GartherData));

        gartherTimer = new Timer(100); // time in ms
        gartherTimer.Elapsed += new ElapsedEventHandler(TimerCallback);
        gartherTimer.Start();
    }

    private void TimerCallback(object source, ElapsedEventArgs e) {
        gartherThread = new Thread(new ThreadStart(GartherData));
    }

    private void GartherData() {
        List<float> gartheredInfo = new List<float>();

        //Do your garthering and parsing here (and put it in the gartheredInfo variable)

        InformationHolder.Instance().graphData = gartheredInfo;

        graphForm.Invoke(new MethodInvoker( //you need to have a reference to the form
                delegate {
                    graphForm.Invalidate(); //or another method that redraws the graph
                }));
    }
}

要获得对表单的引用,您可以使用与InformationHolder一样的技巧:使用单例。 当您想要使用这些信息时,只需从InformationHolder获取信息即可:

InformationHolder.Instance().graphData;

正如我所说的,我个人会如何解决这个问题。可能有一个我不知道的更好的解决方案。如果您有任何问题,可以在下面发布。