ZedGraph - таймер или поток?

Currently, I am using a thread to autofill a zedgraph chart. The problem is that it is very slow and that is not good for the production.

Knowing that:
1. There is a Thread running background to get fresh data from remote server and store them in a local text file.
2. There is another Thread accesses and reads data from the local file and refresh the zedgraph chart.

Personnaly I think this makes the application running very slowly.
Timer component may be better to handle this kind of stuff.
Does anyone has experience in ZedGraph Live Data?
Or any advice would be welcomed.


EDIT: UPDATE UI
Also I would like to know how to update the UI within a Thread so that the user does not have to close and open the form to view the chart.
Thanks

0
nl ja de
Почему таймер был бы лучше? Я не понимаю.
добавлено автор usr, источник
вы думали о backgorundworker без доступа к файлам?
добавлено автор Offler, источник
Я не знаю, сколько данных вы вложили в этот файл, но в 99,9% случаев лучше хранить данные в памяти, чтобы вы могли быстрее получить к нему доступ. (другими словами, сохранить его в переменной и прочитать его из потока графика)
добавлено автор Manuel, источник
Я нахожусь прямо сейчас :)
добавлено автор Manuel, источник
Как и @ dragon112, вам действительно нужен локальный файл для чего-то еще? Если нет, используйте межпоточные комм (возможно, очередь производителя и потребителя), чтобы напрямую передавать данные - это большое преимущество потоков - все они используют одну и ту же память приложения.
добавлено автор Martin James, источник
hi @ dragon112, есть ли у вас ссылка, объясняющая использование этого? получение данных с потоком, сохранение в памяти и доступ к ним для обновления пользовательского интерфейса.
добавлено автор DeathCoder, источник
@MartinJames как насчет межпоточных комм? зная, что у меня есть 12 небольших форм внутри splitContainer, и все Формы должны загружаться при запуске. Что я могу принять в этом случае?
добавлено автор DeathCoder, источник
Привет, никто не может предложить проблему?
добавлено автор DeathCoder, источник

1 ответы

То, как я это сделаю, выглядит следующим образом:

Вы создаете класс, в котором хранятся данные (это также может быть тот же самый класс, который у вас уже есть) для примера, который я назову его InformationHolder .

class InformationHolder {
    private static InformationHolder singleton = null;
    public List graphData; //Can be any kind of variable (List, 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 gartheredInfo = new List();

            //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 gartheredInfo = new List();

        //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;

Как я уже сказал, так я лично решаю это. Может быть, лучшее решение, о котором я не знаю. Если у вас есть вопросы, вы можете разместить их ниже.

1
добавлено
В основном вы должны использовать веб-службу, например, HttpWebRequest , чтобы POST и получить ответ. Если вам нужно использовать запрос GET , вы можете использовать WebRequest . Там есть множество примеров. Если вы не можете понять это, я постараюсь вам помочь.
добавлено автор Manuel, источник
Если вы вызываете InformationHolder , он инициирует себя (в методе Shared() )). InformationGartherer , однако, не имеет такого метода и должен быть создан обычным вызовом new InformationGartherer() .
добавлено автор Manuel, источник
Спасибо @ dragon112 за ваш ответ. У меня вопрос: класс InformationGartherer должен быть внедрен где-то в коде и где? в форме или где? Можно ли вызвать этот класс InformationHolder непосредственно в форме?
добавлено автор DeathCoder, источник
Действительно, я не знаю, как использовать эти функции. Можете ли вы изменить способ получения свежих данных с удаленного сервера? Что-то вроде внутри Thread: - подключение к удаленному серверу; - Получить время и данные OCHL, сохранить их в переменной List; - Отправьте эти переменные в zedGraph, чтобы нарисовать диаграмму.
добавлено автор DeathCoder, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot