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

я работал над программой.у меня есть 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());
        }
    }
}

Ответы [ 2 ]

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

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

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.
    }
1 голос
/ 11 сентября 2011

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

...