Как использовать таймеры и события в C #? - PullRequest
1 голос
/ 11 сентября 2011

хорошо, так что я работал над программой.у меня есть 3 класса.2 из классов имеют таймеры, которые повторяются с разными интервалами, и, как только один «цикл» таймера сделан, он вызывает событие со строкой в ​​качестве возврата.3-й класс подписывается на события двух других классов таймеров и делает что-то со строками, такими как print to console.

, но я не могу заставить его работать, он компилируется нормально, но он просто открывает консоль, а затем закрываетэто быстро (без вывода).ребята, вы видите что-то не так?

спасибо

КОД:

using System;
using System.Timers;
using System.Text;
using System.Xml;
using System.IO;
using System.IO.Ports;
using System.IO.MemoryMappedFiles;
using System.Net;

namespace Final
{
    public class Output
    {
        public static void Main()
        {
            var timer1 = new FormWithTimer();
            var timer2 = new FormWithTimer2();

            timer1.NewStringAvailable += new EventHandler<BaseClassThatCanRaiseEvent.StringEventArgs>(timer1_NewStringAvailable);

            timer2.NewStringAvailable += new EventHandler<BaseClassThatCanRaiseEvent.StringEventArgs>(timer2_NewStringAvailable);
        }

        static void timer1_NewStringAvailable(object sender, BaseClassThatCanRaiseEvent.StringEventArgs e)
        {
            var theString = e.Value;

            //To something with 'theString' that came from timer 1
            Console.WriteLine("Just got: " + theString);
        }

        static void timer2_NewStringAvailable(object sender, BaseClassThatCanRaiseEvent.StringEventArgs e)
        {
            var theString2 = e.Value;

            //To something with 'theString2' that came from timer 2
            Console.WriteLine("Just got: " + theString2);
        }
    }

    public abstract class BaseClassThatCanRaiseEvent
    {
        /// <summary>
        /// This is a custom EventArgs class that exposes a string value
        /// </summary>
        public class StringEventArgs : EventArgs
        {
            public StringEventArgs(string value)
            {
                Value = value;
            }

            public string Value { get; private set; }
        }

        //The event itself that people can subscribe to
        public event EventHandler<StringEventArgs> NewStringAvailable;

        /// <summary>
        /// Helper method that raises the event with the given string
        /// </summary>
        protected void RaiseEvent(string value)
        {
            var e = NewStringAvailable;
            if (e != null)
                e(this, new StringEventArgs(value));
        }
    }

    public partial class FormWithTimer : BaseClassThatCanRaiseEvent
    {
        Timer timer = new Timer();

        public FormWithTimer()
        {
            timer = new System.Timers.Timer(200000);

            timer.Elapsed += new ElapsedEventHandler(timer_Tick); // Everytime timer ticks, timer_Tick will be called
            timer.Interval = (200000);             // Timer will tick evert 10 seconds
            timer.Enabled = true;                       // Enable the timer
            timer.Start();                              // Start the timer
        }

        void timer_Tick(object sender, EventArgs e)
        {
            var url = @"https://gmail.google.com/gmail/feed/atom";
            var USER = "usr";
            var PASS = "pass";

            var encoded = TextToBase64(USER + ":" + PASS);

            var myWebRequest = HttpWebRequest.Create(url);
            myWebRequest.Method = "POST";
            myWebRequest.ContentLength = 0;
            myWebRequest.Headers.Add("Authorization", "Basic " + encoded);

            var response = myWebRequest.GetResponse();
            var stream = response.GetResponseStream();

            XmlReader reader = XmlReader.Create(stream);
            System.Text.StringBuilder gml = new System.Text.StringBuilder();
            while (reader.Read())
                if (reader.NodeType == XmlNodeType.Element)
                    if (reader.Name == "fullcount")
                    {
                        gml.Append(reader.ReadElementContentAsString()).Append(",");
                    }
            RaiseEvent(gml.ToString());
            // Console.WriteLine(gml.ToString());

        }

        public static string TextToBase64(string sAscii)
        {
            System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
            byte[] bytes = encoding.GetBytes(sAscii);
            return System.Convert.ToBase64String(bytes, 0, bytes.Length);
        }
    }


    public partial class FormWithTimer2 : BaseClassThatCanRaiseEvent
    {
        Timer timer = new Timer();

        public FormWithTimer2()
        {
            timer = new System.Timers.Timer(1000);

            timer.Elapsed += new ElapsedEventHandler(timer_Tick2); // Everytime timer ticks, timer_Tick will be called
            timer.Interval = (1000);             // Timer will tick evert 10 seconds
            timer.Enabled = true;                       // Enable the timer
            timer.Start();                              // Start the timer
        }

        void timer_Tick2(object sender, EventArgs e)
        {
            using (var file = MemoryMappedFile.OpenExisting("AIDA64_SensorValues"))
            {
                using (var readerz = file.CreateViewAccessor(0, 0))
                {
                    var bytes = new byte[194];
                    var encoding = Encoding.ASCII;
                    readerz.ReadArray<byte>(0, bytes, 0, bytes.Length);

                    //File.WriteAllText("C:\\myFile.txt", encoding.GetString(bytes));

                    StringReader stringz = new StringReader(encoding.GetString(bytes));

                    var readerSettings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment };
                    using (var reader = XmlReader.Create(stringz, readerSettings))
                    {
                        System.Text.StringBuilder aida = new System.Text.StringBuilder();
                        while (reader.Read())
                        {
                            using (var fragmentReader = reader.ReadSubtree())
                            {
                                if (fragmentReader.Read())
                                {
                                    reader.ReadToFollowing("value");
                                    //Console.WriteLine(reader.ReadElementContentAsString() + ",");
                                    aida.Append(reader.ReadElementContentAsString()).Append(",");
                                }
                            }
                        }
                        RaiseEvent(aida.ToString());
                        //Console.WriteLine(aida.ToString());
                    }
                }
            }
        }
    }
}

Ответы [ 3 ]

4 голосов
/ 11 сентября 2011

Ваша программа закрывается, поскольку она завершает метод Main. Чтобы сделать ваш проект не близким, вы можете добавить Console.ReadLine() в конце метода

4 голосов
/ 11 сентября 2011

Вы выходите из метода Main (который остановит ваше приложение), не дожидаясь результатов. Просто добавьте Console.ReadLine() для ожидания:

public static void Main()
{
    var timer1 = new FormWithTimer();
    var timer2 = new FormWithTimer2();

    timer1.NewStringAvailable += new EventHandler<BaseClassThatCanRaiseEvent.StringEventArgs>(timer1_NewStringAvailable);
    timer2.NewStringAvailable += new EventHandler<BaseClassThatCanRaiseEvent.StringEventArgs>(timer2_NewStringAvailable);
    Console.ReadLine();
}
3 голосов
/ 11 сентября 2011

Ваша программа заканчивается при выходе из функции Main ().То, что вы делаете внутри метода, - это инициализация таймеров и выход.Вам необходимо реализовать механизм ожидания выхода из какого-либо условия, например:

public static void Main() 
        { 
            var timer1 = new FormWithTimer(); 
            var timer2 = new FormWithTimer2(); 

            timer1.NewStringAvailable += new EventHandler<BaseClassThatCanRaiseEvent.StringEventArgs>(timer1_NewStringAvailable); 

            timer2.NewStringAvailable += new EventHandler<BaseClassThatCanRaiseEvent.StringEventArgs>(timer2_NewStringAvailable); 
            while (NotExit()){
               Thread.Sleep(1000);
            }
        } 

Таким образом, вы можете реализовать метод NotExit (), который будет останавливать основной поток на основе определенного условия (например, пользовательнажимает клавишу и так далее).Просто хорошая практика: перед выходом попробуйте аккуратно остановить все запущенные потоки (каждый тик Timer создает новый поток), чтобы код, выполняемый для тика eack timer, запускался в отдельном потоке.Способ сделать это - использовать метод Join () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...