Читайте XML постоянно в C # - PullRequest
       16

Читайте XML постоянно в C #

0 голосов
/ 02 сентября 2018

У меня есть XML-файл следующим образом:

<?xml version="1.0" encoding="ISO-8859-1"?>
<sami>
<title>IN[1]=false</title>
<title>IN[2]=true</title>
<title>OUT[1]=true</title>
<title>OUT[2]=flase</title>
<title>OUT[3]=flase</title>
<title>OUT[4]=flase</title>
<title>$IN[5]=false</title>
</sami>

Вопрос: как читать XML-данные каждую секунду, используя C #?

Я попробовал следующее:

private void Form1_Load(object sender, EventArgs e)
{
    DateTime nextRead;
    Thread thread = new Thread(() =>
    {
        nextRead = DateTime.Now.AddSeconds(1000);
        XDocument doc = XDocument.Load("C:\\Users\\lenovo\\Desktop\\Sxml.xml");
        var result = doc.Descendants("title").ToList();
        textBox1.Text = result[0].Value;
      //  listBox1.Items.Add(result[0].Value);
       // listBox1.Items.Add(result[1].Value);
       // listBox1.Items.Add(result[2].Value);
        Thread.Sleep(Math.Max(0, (DateTime.Now - nextRead).Milliseconds));

    });
    thread.Start();
}

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Для этого вам необходимо добавить в форму Timer из панели инструментов.

Установить timer1 интервал до 1000 миллисекунд. Создать событийный гадлер для timer1.Tick события:

public partial class Form1 : Form
{
    XDocument doc;

    public Form1()
    {
        InitializeComponent();

        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        doc = XDocument.Load("C:\\Users\\Mi\\Desktop\\Sxml.xml");
        var result = doc.Descendants("title").ToList();
        textBox1.Text = result[0].Value;
        listBox1.Items.Add(result[0].Value);
        listBox1.Items.Add(result[1].Value);
        listBox1.Items.Add(result[2].Value);
    }
}
0 голосов
/ 02 сентября 2018

Вы можете использовать Task.Delay, чтобы повторить чтение XML-файла. Во-первых, создайте метод задания для повторного чтения XML-файла:

static async Task RepeadtReadingXml(int delayMillis, int repeatMillis, CancellationToken ct)

    {

        Console.WriteLine("{0}: Start reading xml file", DateTime.Now);

        await Task.Delay(delayMillis, ct);

        while (true)

        {

            Console.WriteLine("{0}: Reading xml file every 1 sec", DateTime.Now);

            //***************************************************//
            //     Add you logic to read your xml file here      //
            //***************************************************//

            await Task.Delay(repeatMillis, ct);

        }

    }

И позвоните туда, где вам нужно повторить чтение:

            var cts = new CancellationTokenSource(); // Work for 5 sec  

            try

            {

                RepeadtReadingXml(2000, 1000, cts.Token).Wait();

            }

            catch (AggregateException ae)

            {

                ae.Handle(e => e is TaskCanceledException);

            }
...