如题,越多越好,这二个概念,理论也看了几次了,照着人家的代码也敲过不少,感觉理解还是不够,十分希望有现实中的应用例子,代码,或者教程都行,让我感受下。还有泛型。最好也有。呵
高分求购了。哈越多越好。

解决方案 »

  1.   

    随手写的,大概就这意思public class XmlClass
        {
            private delegate void XmlLoad ();//这是委托
            private event XmlLoad XmlLoading;//xml加载中触发的事件
            private event XmlLoad XmlLoaded;//xml加载完成后触发的事件        //当运行此方法后会引发2个事件
            public void LoadXml ( string path )
            {
                if ( XmlLoading != null )
                    XmlLoading.Invoke();            XmlDocument xml = new XmlDocument();
                xml.Load( path );            if ( XmlLoaded != null )
                    XmlLoaded.Invoke();
            }
        }
      

  2.   

    使用的时候  就是  XmlLoading += new XmlLoad( function );
      

  3.   


    跨窗体线程调用控件或窗体//跨线程关闭主窗口form---->this
    ISynchronizeInvoke synchronizer;
                    synchronizer = this;
                    if (synchronizer.InvokeRequired)
                    {
                        MethodInvoker invoker = new
                        MethodInvoker(this.Close);
                        synchronizer.Invoke(invoker, null);
                    }
                    else
                    { this.Close(); }////////////////////////////////////////////////////////////////////////////////////// #region backgroundwoeker里鼠标和按钮禁用,
            /// <summary>
            /// pbtnPublish.Enabled = b;//false
            /// this.Cursor = System.Windows.Forms.Cursors.WaitCursor;
            /// </summary>
            /// <param name="b">false</param>
            public void btnPublishStatus(bool b)
            {
                if (b)
                {
                    CanPublishAbort(false);
                    CanPublishStart(b);
                    CursorSet(System.Windows.Forms.Cursors.Default);
                }
                else
                {
                    CanPublishAbort(true);
                    CanPublishStart(b);//                CursorSet(System.Windows.Forms.Cursors.WaitCursor);
                }
            }
            delegate void CanPub(bool can);
            public void CanPublishStart(bool can)
            {
                if (pbtnPublishStart.InvokeRequired)
                {
                    CanPub cp = new CanPub(CanPublishStart);
                    pbtnPublishStart.Invoke(cp, new object[] { can });
                }
                else { pbtnPublishStart.Enabled = can; }
            }
            protected void CanPublishAbort(bool can)
            {
                if (pbtnPublishAbort.InvokeRequired)
                {
                    CanPub cp = new CanPub(CanPublishAbort);
                    pbtnPublishAbort.Invoke(cp, new object[] { can });
                }
                else { pbtnPublishAbort.Enabled = can; }
            }        delegate void SetCursor(Cursor c);
            public void CursorSet(Cursor c)
            {
                if (this.InvokeRequired)
                {
                    SetCursor sc = new SetCursor(CursorSet);
                    this.Invoke(sc, new object[] { c });
                }
                else
                {
                    this.Cursor = c;
                }        }
            #endregion
      

  4.   

    通过事件完成窗体间的传值
    http://topic.csdn.net/u/20080626/17/1742fccb-1513-4543-9f9f-045660d24666.html
      

  5.   

    1.定义事件委托,如:public delegate void NameEventHandler(object source,NameEventArgs args);
    2.创建事件委托实例,如:public event NameEventHandler handler;
    3.事件处理程序,如:handler+=new NameEventHandler(NameChange);
    4.触发事件,调用事件委托实例,如:
      if(handler!=null)
        handler(this,new NameEventArgs(name,list.count));
      

  6.   


    跨窗体线程调用控件或窗体//跨线程关闭主窗口form---->this
    ISynchronizeInvoke synchronizer;
                    synchronizer = this;
                    if (synchronizer.InvokeRequired)
                    {
                        MethodInvoker invoker = new
                        MethodInvoker(this.Close);
                        synchronizer.Invoke(invoker, null);
                    }
                    else
                    { this.Close(); }////////////////////////////////////////////////////////////////////////////////////// #region backgroundwoeker里鼠标和按钮禁用,
            /// <summary>
            /// pbtnPublish.Enabled = b;//false
            /// this.Cursor = System.Windows.Forms.Cursors.WaitCursor;
            /// </summary>
            /// <param name="b">false</param>
            public void btnPublishStatus(bool b)
            {
                if (b)
                {
                    CanPublishAbort(false);
                    CanPublishStart(b);
                    CursorSet(System.Windows.Forms.Cursors.Default);
                }
                else
                {
                    CanPublishAbort(true);
                    CanPublishStart(b);//                CursorSet(System.Windows.Forms.Cursors.WaitCursor);
                }
            }
            delegate void CanPub(bool can);
            public void CanPublishStart(bool can)
            {
                if (pbtnPublishStart.InvokeRequired)
                {
                    CanPub cp = new CanPub(CanPublishStart);
                    pbtnPublishStart.Invoke(cp, new object[] { can });
                }
                else { pbtnPublishStart.Enabled = can; }
            }
            protected void CanPublishAbort(bool can)
            {
                if (pbtnPublishAbort.InvokeRequired)
                {
                    CanPub cp = new CanPub(CanPublishAbort);
                    pbtnPublishAbort.Invoke(cp, new object[] { can });
                }
                else { pbtnPublishAbort.Enabled = can; }
            }        delegate void SetCursor(Cursor c);
            public void CursorSet(Cursor c)
            {
                if (this.InvokeRequired)
                {
                    SetCursor sc = new SetCursor(CursorSet);
                    this.Invoke(sc, new object[] { c });
                }
                else
                {
                    this.Cursor = c;
                }        }
            #endregion
      

  7.   

    这个例子我觉得不错
    http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx
      

  8.   


    using System;
    using System.Collections.Generic;
    using System.Text;namespace UseMultiDelegateExample
    {
        public delegate void MyMultiDelegate(int value );    //事件发布者类
        public class  Publisher 
        {
            public MyMultiDelegate handlers; //事件响应者清单
        }   
        //事件响应者类
        public class Subscriber
        {
            //事件处理函数
            public void MyMethod(int i )
            {
                Console.WriteLine(i);
            }
        }    class Program
        {
            static void Main(string[] args)
            {
                //一个事件源对象
                Publisher p = new Publisher();
                //两个事件响应者
                Subscriber s1 = new Subscriber();
                Subscriber s2 = new Subscriber();
                //可以直接调用Delegate类的静态方法组合多个委托
                p.handlers = System.Delegate.Combine(p.handlers, new MyMultiDelegate(s1.MyMethod)) as MyMultiDelegate;
                p.handlers = System.Delegate.Combine(p.handlers, new MyMultiDelegate(s2.MyMethod)) as MyMultiDelegate;
                //或调用+=运算符组合委托
                //p.handlers += new MyMultiDelegate(s1.MyMethod);
                //p.handlers += new MyMultiDelegate(s2.MyMethod);
                //最简单的写法
                //p.handlers += s1.MyMethod;
                //p.handlers += s2.MyMethod;
                
                //直接调用委托变量,代表激发事件
                p.handlers(10);            Console.ReadKey();        }
        }
    }