C# 启动异步进程的类上的异步侦听

C# 启动异步进程的类上的异步侦听,c#,events,asynchronous,listener,C#,Events,Asynchronous,Listener,解决版本 好的,给你。我甚至不知道如何恰当地问这个问题。我正在创建一个在程序中异步弹出的窗体,这样它就不会干扰主程序。在这个表单中,我想显示来自基类的数据,在这个例子中,它是Metronome类。Metronome类也是异步启动表单的同一个类 我似乎不知道该怎么做,或者这是否可能。我看过各种教程,但似乎无法让它正常工作。任何帮助都将不胜感激 这是我的密码: using System; namespace Project2 { public class TimeOfTick : Even

解决版本

好的,给你。我甚至不知道如何恰当地问这个问题。我正在创建一个在程序中异步弹出的窗体,这样它就不会干扰主程序。在这个表单中,我想显示来自基类的数据,在这个例子中,它是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();
        }
    }
}

在侦听器类中创建公共Metronome属性,并在MetronomeStarter方法中将该属性设置为该属性。这将使您能够在Listener类中完全访问实例化Listener对象的Metronome对象中的所有内容

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

你到底是怎么做到的??我是C的新手,我不太明白你说的话。谢谢你的帮助!!那么Metronome酒店呢?:-这就是get/set类型吗?在listener类中,将m字段更改为属性:如果将其命名为MetronomeItem而不是m,则使用get-and-set将其公开,根据我提供的示例,代码将按照您希望的方式工作。嘿,很抱歉再次打扰您,但这似乎不起作用。我在第一篇文章中编辑了代码。我做错了什么?再次感谢你的帮助。好吧,别担心,我真的是个白痴。我现在明白了。刚把节拍器的新部件拆了。我的错。谢谢你的帮助,罗斯。