создание событий в C # и вывод?

Я работал над программой. У меня 3 класса. У 2 классов есть таймеры, которые повторяются с разными интервалами, и после того, как один «цикл» таймера выполнен, он вызывает событие со строкой в ​​качестве возврата. третий класс подписывается на события двух других классов таймера и выводит их на экран. отлично работает!

но моя проблема в том, что он печатает их отдельно. скажем, в настоящее время запускается первый класс таймера, а затем каждые 2 минуты подает «привет», а второй класс - «собака» каждую секунду. затем каждый раз, когда возникает событие, он выводит возникшее событие на консоль. Я бы хотел, чтобы вместо этого он печатал «hellodog» каждую секунду.

я думал: так каждый раз, когда срабатывает таймер, он будет вызывать событие и обновлять строку в классе «output» с текущим значением, а затем делать еще один таймер, который срабатывает каждую секунду, этот таймер будет читать обе обновленные строки вместе как один вывод типа "hellodog". возможно ли это, если это самый простой способ, я думаю. как мне реализовать эту идею?

если сбивает с толку, уточню.

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);
            Console.ReadLine();
        }

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

            //To something with 'theString' that came from timer 1
            Console.WriteLine(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(theString2);
        }
    }

    public abstract class BaseClassThatCanRaiseEvent
    {
        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;

        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)
        {
            ... 
            RaiseEvent(gml.ToString());                    
        }
    }


    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)
        {
            ...
            RaiseEvent(aida.ToString());
        }
    }
}

person Csharpz    schedule 11.09.2011    source источник
comment
возможный дубликат Как подписаться на поднятые события и печать вместе?   -  person John Saunders    schedule 11.09.2011
comment
Также см. meta.stackexchange.com/questions/2950/   -  person John Saunders    schedule 11.09.2011
comment
Если вы действительно понимаете, то можете немного отредактировать свой вопрос.   -  person John Saunders    schedule 11.09.2011
comment
готово, убираем гуманизм с наших постов ...   -  person Csharpz    schedule 11.09.2011
comment
Это не дискуссионный форум; мы не разговариваем. Это сайт вопросов и ответов, поэтому гуманизм может помешать.   -  person John Saunders    schedule 11.09.2011
comment
да, я понял, я просто пошутил. лишь бы в этом не превратилось все наше общество. (/сарказм)   -  person Csharpz    schedule 11.09.2011


Ответы (2)


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

private static string timer1Value = string.Empty;
private static string timer2Value = string.Empty;
private static FormWithTimer timer1;
private static FormWithTimer2 timer2;

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

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

    timer2.NewStringAvailable += new EventHandler<BaseClassThatCanRaiseEvent.StringEventArgs>(timer1_NewStringAvailable);
    Console.ReadLine();
}


static void timer1_NewStringAvailable(object sender, BaseClassThatCanRaiseEvent.StringEventArgs e)
{
    if (sender == timer1)
    {
        timer1Value = e.Value.ToString();
    }
    else if (sender == timer2)
    {
        timer2Value = e.Value.ToString();
    }

    if (timer1Value != String.Empty && timer2Value != String.Empty)
    {
        Console.WriteLine(timer1Value + timer2Value); 
        // Do the string concatenation as you want.
    }
person CharithJ    schedule 11.09.2011
comment
в этой строке if (sender == FormWithTimer) я получаю ошибку, это тип, используемый как переменная. но, может быть, я смогу это исправить. какие-нибудь советы? - person Csharpz; 11.09.2011
comment
Извините, это должен быть отправитель == timer1 и отправитель == timer2 - person CharithJ; 11.09.2011
comment
ах, спасибо, но теперь я получаю ссылку на объект, которая требуется для нестатического метода или поля Output.timer1 - person Csharpz; 11.09.2011
comment
Исправлено в коде. По логике таймеры timer1 и timer2 должны быть статическими. частный статический FormWithTimer timer1; частный статический FormWithTimer2 timer2; - person CharithJ; 11.09.2011
comment
еще одно (но это предупреждения) Поле Output.timer1 никогда не назначается и всегда будет иметь значение по умолчанию null. и он компилируется, но он просто сидит на пустой консоли, без вывода. - person Csharpz; 11.09.2011
comment
Исправлено в коде. Не объявляйте снова timer1 и timer2 в методе Main. - person CharithJ; 11.09.2011
comment
хорошо, теперь работает! Вы мне очень помогли, теперь я могу продолжить свой проект Arduino. - person Csharpz; 11.09.2011
comment
он работает вроде как ... поэтому, если я установил один таймер на 3 минуты, а затем другой таймер на 2 секунды, он ждет 3 минуты, а затем начнет печатать на экране каждые 2 секунды. Но все значения верны, он печатает их вместе и обновляет правильно, запуск занимает всего 3 минуты. и, кстати, это синтаксическая ошибка в вашем коде ... StringEventArgs ›timer1_NewStringAvailable); ... перед timer1 должен быть (. - person Csharpz; 11.09.2011
comment
11-я строка в поле кода, в конце StringEventArgs ›timer1_NewStringAvailable); должно быть StringEventArgs ›(timer1_NewStringAvailable); PS что-нибудь о том, как исправить отставание в 3 минуты - person Csharpz; 12.09.2011

Когда события обрабатываются в вашем примере, у них нет доступа к информации о других событиях. Если вы хотите иметь 2 события, которые обновляют строки, но хотите, чтобы обработчик печатал данные из обеих обновленных строк, вам нужно, чтобы обработчики событий имели доступ к обеим этим строкам. Вы можете либо сохранить их в переменных класса обработки событий, либо сделать их общедоступными свойствами классов, которые вызывают события. Таким образом, в любом обработчике событий у вас будет доступ к обновленным строкам из других событий.

person Adam Jones    schedule 11.09.2011