【问题标题】:Asynchronous Listening on class that launched asynchronous process异步监听启动异步进程的类
【发布时间】:2011-03-30 14:21:35
【问题描述】:

已解决的版本

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

【问题讨论】:

    标签: c# events asynchronous listener


    【解决方案1】:

    在您的 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); 
            } 
    

    【讨论】:

    • 你到底是怎么做到的?我是 C# 的新手,我不太明白你所说的。感谢您的帮助!
    • 那么节拍器属性呢? :-) 那是 get/set 类型的东西吗?
    • 在您的侦听器类中,将“m”字段更改为属性:如果您将其命名为 MetronomeItem 而不是“m”,请使用 get 和 set 将其公开,代码将按照您的方式工作想要它——根据我提供的样本..
    • 嘿,很抱歉再次打扰您,但这似乎不起作用。我在最初的帖子中编辑了代码。我究竟做错了什么?再次感谢您的帮助。
    • 好吧,没关系,我正式是个白痴。我现在明白了。只需要删除新的节拍器部分。我的错。感谢您的帮助拉斯。
    猜你喜欢
    • 2011-07-09
    • 1970-01-01
    • 2019-12-18
    • 2011-12-06
    • 1970-01-01
    • 2017-02-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多