异步侦听在启动异步进程的类上

时间:2010-08-16 18:39:23

标签: c# events asynchronous listener

已解决的版本

好的,就是这样。我甚至不确定如何正确地提出这个问题。我正在创建一个异步弹出程序的表单,这样它就不会干扰主程序。在这个表单中,我想显示来自“基类”的数据,在本例中,它是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 :(得分:0)

在Listener类中创建一个公共Metronome属性,并在MetronomeStarter方法中将该属性设置为“this”。这将使您在Listener类中完全访问Metronome对象中实例化Listener对象的所有内容。

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