Асинхронное прослушивание класса, который запустил асинхронный процесс - PullRequest
0 голосов
/ 16 августа 2010

РЕШЕННАЯ ВЕРСИЯ

Хорошо, вот оно. Я даже не уверен, как правильно задать вопрос. Я создаю форму, которая появляется в программе асинхронно, чтобы она не мешала основной программе. В этой форме я хочу отобразить данные, которые поступают из «базового класса», в данном примере это класс Metronome. Класс Metronome также является тем же классом, который запускает форму асинхронно.

Кажется, я не могу понять, как это сделать или возможно ли это. Я посмотрел на различные учебники и не могу заставить его работать. Любая помощь будет принята с благодарностью.

Вот мой код:

using System;

namespace Project2
{
    public class TimeOfTick : EventArgs
    {
        private DateTime TimeNow;
        public DateTime Time
        {
            set
            {
                TimeNow = value;
            }
            get
            {
                return this.TimeNow;
            }
        }
    }

    public class Metronome
    {
        public event TickHandler Tick;
        public delegate void TickHandler(Metronome m, TimeOfTick e);

        public delegate void ListenerDelegate();
        public static void myCallback(IAsyncResult result)
        {
            ListenerDelegate del = (ListenerDelegate)result.AsyncState;
            del.EndInvoke(result);
        }

        public void MetronomeStarter()
        {
            Listener listen = new Listener();
            listen.MetronomeItem = this;
            ListenerDelegate del = new ListenerDelegate(listen.Starter);
            del.BeginInvoke(myCallback, del);
        }

        public void Start()
        {
            while (true)
            {
                System.Threading.Thread.Sleep(3000);
                if (Tick != null)
                {
                    TimeOfTick TOT = new TimeOfTick();
                    TOT.Time = DateTime.Now;
                    Tick(this, TOT);
                }
            }
        }
    }

    public class Listener
    {
        private Metronome metronomeItem;   
        public Metronome MetronomeItem
        {
            get { return metronomeItem; }
            set { metronomeItem = value; }
        }

        public void Starter()
        {
            Console.WriteLine("Starting Listener class");           
            metronomeItem.Tick += new Metronome.TickHandler(HeardIt);            
        }

        void HeardIt(Metronome m, TimeOfTick e)
        {
            System.Console.WriteLine("HEARD IT AT {0}", e.Time);
        }

    }

    class Test
    {
        static void Main()
        {
            Metronome m = new Metronome();            
            m.MetronomeStarter();
            m.Start();
        }
    }
}

1 Ответ

0 голосов
/ 16 августа 2010

Создайте открытое свойство Metronome в своем классе Listener и установите для этого свойства значение «this» в вашем методе MetronomeStarter. Это даст вам полный доступ в классе Listener ко всему объекту Metronome, который создает экземпляр объекта Listener.

 public void MetronomeStarter() 
        { 
            Listener listen = new Listener(); 
            listen.MetronomeItem = this;
            ListenerDelegate del = new ListenerDelegate(listen.Starter); 
            del.BeginInvoke(myCallback, del); 
        } 
...